#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.
Комментариев нет:
Отправить комментарий