Как создать экземпляр нестатического внутреннего класса с отражением в Java?
Я пытаюсь создать экземпляр внутреннего класса, определенного в следующий Java код:
public class Mother {
public class Child {
public void doStuff() {
// ...
}
}
}
когда я пытаюсь получить экземпляр ребенка такой
Class<?> clazz= Class.forName("com.mycompany.Mother$Child");
Child c = clazz.newInstance();
Я получаю это исключение:
java.lang.InstantiationException: com.mycompany.Mother$Child
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
...
что я упустил ?
2 ответов:
есть дополнительный "скрытый" параметр, который является экземпляром заключающего класса. Вам нужно будет добраться до конструктора с помощью
Class.getDeclaredConstructorи затем укажите экземпляр заключающего класса в качестве аргумента. Например:// All exception handling omitted! Class<?> enclosingClass = Class.forName("com.mycompany.Mother"); Object enclosingInstance = enclosingClass.newInstance(); Class<?> innerClass = Class.forName("com.mycompany.Mother$Child"); Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass); Object innerInstance = ctor.newInstance(enclosingInstance);EDIT: в качестве альтернативы, если вложенный класс на самом деле не должен ссылаться на вложенный экземпляр, сделайте его вложенным статический класс:
public class Mother { public static class Child { public void doStuff() { // ... } } }
этот код создает экземпляр внутреннего класса.
Class childClass = Child.class; String motherClassName = childClass.getCanonicalName().subSequence(0, childClass.getCanonicalName().length() - childClass.getSimpleName().length() - 1).toString(); Class motherClassType = Class.forName(motherClassName) ; Mother mother = motherClassType.newInstance() Child child = childClass.getConstructor(new Class[]{motherClassType}).newInstance(new Object[]{mother});
Comments