programing tip

Java에서 리플렉션을 사용하여 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

itbloger 2020. 12. 1. 07:45
반응형

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

내가 무엇을 놓치고 있습니까?


포함하는 클래스의 인스턴스 인 추가 "숨겨진"매개 변수가 있습니다. 를 사용하여 생성자 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);

편집 : 또는 중첩 된 클래스가 실제로 둘러싸는 인스턴스를 참조 할 필요가없는 경우 대신 중첩 된 정적 클래스로 만듭니다 .

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

참고 URL : https://stackoverflow.com/questions/17485297/how-to-instantiate-an-inner-class-with-reflection-in-java

반응형