#java #классы
Нужно создать экземпляр такого вложенного класса (причем, нельзя трогать код вне
main() метода):
public class Outer {
public static void main(String[] args){
// код можно добавить только сюда
}
public static class Inner {
Inner Inner = new Inner();
public Inner() {
System.out.println("Test");
}
}
}
казалось бы, экземпляр вложенного класса создается таким образом:
Outer.Inner inner = new Outer.Inner();
но вызов конструктора внутри вложенного класса все это ломает.
Как обойти эту проблему и таки создать экземпляр вложенного класса из main() метода?
Ответы
Ответ 1
Disclaimer: всё нижеописанное противоестественно, это ни в коем случае не следует применять на практике, если только вы не пишете низкоуровневые инструменты для Java-разработчиков. Как бы странно это не звучало, но Java можно заставить создать экземпляр объекта, не вызывая никаких конструкторов, в том числе конструкторов его полей. Делается это при помощи проприетарного API реализации JRE от Oracle (Sun). Ключом ко всему является скрытый в дебрях проприетарного кода (и посему не описанный в документации JDK) класс ReflectionFactory: ReflectionFactory rf = ReflectionFactory.getReflectionFactory(); Constructor objDef = Object.class.getDeclaredConstructor(); Constructor intConstr = rf.newConstructorForSerialization(Inner.class, objDef); Inner inner = Inner.class.cast(intConstr.newInstance()); Теперь у нас есть экземпляр класса Inner, в котором все поля имеют значение null: System.out.println(inner.getClass()); // class Outer$Inner System.out.println(inner.inner); // null Документация из OpenJDK: http://www.docjar.com/docs/api/sun/reflect/ReflectionFactory.html Источник: http://www.javaspecialists.eu/archive/Issue175.html P. S. Вообще, задача очень странная. Либо существует более простой (но почему-то неочевидный для меня) способ её решения, либо она предназначается для крутых спецов по Java Reflections API и задаётся на собеседованиях в компании вроде Zeroturnaround.
Комментариев нет:
Отправить комментарий