Такое возможно если использовать прокси объект. То есть все ссылки в программе будут смотреть на прокси-объект, который инкапсулирует в себе ссылку непосредственно на тот объект, который вам хочется заменить.
// MyClass - тип объекта, который хотим подменить
// унаследоваться необходимо, чтобы не сломать совместимость типов
class MyProxy extends MyClass {
// наш спрятанный объект, который будем заменять в будущем
private MyClass hidden;
@Override
public int hashCode() {
return hidden.hashCode();
}
@Override
public boolean equals(Object o) {
return hidden.equals(o);
}
// и так далее заоверрайдить все-все публичные
// методы наследуемого класса
// правда, с публичными свойствами будет проблема - для
// их замены необходима более сложная логика:
@Override
public int calculate() {
hidden.var = var; // на случай если поле было изменено извне
int result = hidden.calculate();
var = hidden.var; // а это если поле было изменено изнутри
return result;
}
public int var;
// а вот и главный заменщик
void setObject(MyClass new_o) {
hidden = new_o;
var = new_o.var;
}
}
Потом останется только найти все места, где создаётся объект и заменить его на прокси объект. Далее настоящий объект подменяется вызовом setObject().
Если у проксируемого объекта есть final поля или методы, то придётся отказаться от наследования MyClass и заменить во всём проекте тип ссылок MyClass на MyProxy.