2013-07-05 38 views
51

私は、次のJavaコードで定義された内部クラスをインスタンス化しよう:Javaでリフレクションして内部クラスをインスタンス化する方法は?

public class Mother { 
     public class Child { 
      public void doStuff() { 
       // ... 
      } 
     } 
} 

私はこの

​​

のように子供のインスタンスを取得しようとすると、私はこの例外を取得:

java.lang.InstantiationException: com.mycompany.Mother$Child 
    at java.lang.Class.newInstance0(Class.java:340) 
    at java.lang.Class.newInstance(Class.java:308) 
    ... 

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

+2

あなたの内部クラスは静的ではありません...これは目的ですか?おそらくC#の背景から来るでしょうか? ;) – fge

+1

静的なアイデアをお寄せいただきありがとうございます!実際、内部クラスの代わりに静的ネストされたクラスを使用することは、私の人生を楽にします。 – Stephan

+2

内部クラスがstatic宣言されていない場合、このクラスのインスタンスは外部クラスのインスタンスの存在に依存します。これは、すべての内部クラスがデフォルトで「静的」であり、親インスタンスなしでインスタンス化できるC#とは異なります。 – fge

答えて

100

余分な「隠し」パラメータがあります。これは、囲むクラスのインスタンスです。 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); 

EDIT:

public class Mother { 
    public static class Child { 
      public void doStuff() { 
       // ... 
      } 
    } 
} 
+1

私は実際の問題は、OPはクラスが静的で始まらないことを意味するわけではないと信じていますが、間違っている可能性があります。 – fge

+0

@ fge:おそらく。私はその答えに言及します。 –

+6

内部クラスがpublicでない場合は、動作させるために 'ctor.setAccessible(true)'を呼び出す必要があります。 – Beccari

0

このコードは、作成:ネストされたクラスは、実際に囲むインスタンスを参照する必要がない場合あるいは、それの代わりにネストされた静的クラス作ります内部クラスインスタンス。

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}); 
関連する問題