次の 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)
...
何が足りないのでしょうか?
ベストアンサー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);
あるいは、ネストされたクラスが実際には囲んでいるインスタンスを参照する必要がない場合は、ネストされたクラスにします。静的代わりにクラス:
public class Mother {
public static class Child {
public void doStuff() {
// ...
}
}
}