次の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);
編集:または、ネストされたクラスが実際に囲むインスタンスを参照する必要がない場合は、代わりにネストされたstaticクラスにします:
public class Mother {
public static class Child {
public void doStuff() {
// ...
}
}
}