- ベストアンサー
内部クラスのインスタンスを動的に取得したい
- 内部クラスのインスタンスを動的に取得する方法について教えてください。
- 上記のコードで動的に取得しようとするとエラーが発生します。エラー回避の方法を教えてください。
- 他の方法で内部クラスのインスタンスを動的に取得することはできますか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
内部クラスに対してClass#newInstance()をそのまま呼んではいけません。 内部クラスのコンストラクタは、Javaの内部的には親クラスのインスタンスを引数にもちます。つまり、new TESTSUB1()は内部的にnew TESTSUB1([testインスタンス])という形で呼ばれるわけです。従って直接newInstance()を呼んでも例外が発生するだけです。 これは、内部クラスが親クラスを無条件で参照可能にするための措置のようです。従って、newInstance()する際に自身(親クラスのインスタンス)を引数で渡す必要があると思います。 簡単な実験を書いてみました。 import java.lang.reflect.*; public class Sample { public static void main(String[] args){ new Sample(); } public Sample(){ try { Class arg[] = {getClass()}; Constructor c = Class.forName("Sample$A").getConstructor(arg); Object obj[] = {this}; c.newInstance(obj); } catch(Exception ex){ ex.printStackTrace(); } } class A { public A(){ System.out.println("new A!"); } } } これで、とりあえず"new A!"と出力されるようです。面倒ですね。 個人的には、「newInstanceするようなものを内部クラスにしてはダメ」ということかな?とも思いますが・・・。そういう使い方をするならば独立したクラスにすべきでしょうから。
お礼
迅速なご解答ありがとうございました。 無事、意図通りの実装ができました。 目から鱗の思いです。