Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Как создать экземпляр вложенного класса внутри которого есть вызов конструктора?

#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.

Комментариев нет:

Отправить комментарий