Изменить реализованные интерфейсы объекта во время выполнения
Можно ли динамически добавлять в список интерфейсов, реализуемых объектом (таким, что instanceof
возвращает true, а приведение не завершается)?
У меня есть набор объектов, типы которых должны динамически меняться во время выполнения. По мере изменения их состояния все больше их методов / свойств становятся действительными. В настоящее время это делается "грубой силой"... все участники разоблачены, и неправильный вызов в неправильное время - ошибка. В идеале я хотел бы использовать статическую типизацию и передавать эти объекты методам, которые ожидают определенных интерфейсов. Набор интерфейсов, которые реализует объект, будет только увеличиваться, поэтому старые ссылки будут оставаться действительными.
Можно ли изменить реализованные интерфейсы объекта во время выполнения, используя встроенное отражение или сторонние манипуляции с байт-кодом?
1 ответ
Вы можете использовать прокси, но, как показывают комментарии, это почти всегда не лучший вариант.
Вам было бы лучше создать свой объект как многогранный.
interface Interface1 {
String getI1();
}
interface Interface2 {
String getI2();
}
class Multifaceted {
String i1;
String i2;
private final Interface1 asInterface1 = new Interface1() {
@Override
public String getI1() {
return i1;
}
};
private final Interface2 asInterface2 = new Interface2() {
@Override
public String getI2() {
return i2;
}
};
public Interface1 asInterface1() {
if ( i1 == null ) {
throw new InvalidStateException("I am not ready to be one of these yet!");
}
return asInterface1;
}
public Interface2 asInterface2() {
return asInterface2;
}
}