Подтвердить что ты не робот

Как создать внутренний класс с отражением в Java?

Я пытаюсь создать экземпляр внутреннего класса, определенного в следующем Java-коде:

 public class Mother {
      public class Child {
          public void doStuff() {
              // ...
          }
      }
 }

Когда я пытаюсь получить экземпляр Child, подобный этому

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

Что мне не хватает?

4b9b3361

Ответ 1

Там есть дополнительный "скрытый" параметр, который является экземпляром окружающего класса. Вам нужно будет получить конструктор, используя 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() {
              // ...
          }
     }
}

Ответ 2

Этот код создает внутренний экземпляр класса.

  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});