Javaでリフレクションを使用して内部クラスをインスタンス化する方法 質問する

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

何が足りないのでしょうか?

ベストアンサー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() {
              // ...
          }
     }
}

おすすめ記事