web-dev-qa-db-ja.com

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

私は何が欠けていますか?

61
Stephan

追加の「非表示」パラメーターがあります。これは、囲んでいるクラスのインスタンスです。 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() {
              // ...
          }
     }
}
113
Jon Skeet