반응형
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});
반응형
'programing tip' 카테고리의 다른 글
'관리자 권한으로 실행'은 정확히 무엇을합니까? (0) | 2020.12.01 |
---|---|
git reset은 'more?'를 묻습니다. (0) | 2020.12.01 |
Pandas DataFrame을 색인별로 정렬하는 방법은 무엇입니까? (0) | 2020.12.01 |
cpp 프로젝트 폴더를 통해 clang-format을 호출하는 방법은 무엇입니까? (0) | 2020.12.01 |
@SuppressWarnings에 "비공개 가능"경고를 표시하지 않으려면 어떤 값을 사용해야합니까? (0) | 2020.12.01 |