- 締切済み
サブクラスで.newInstance()でインスタンス化できない
以下のようにClass.forNameで取得したクラスをインスタンス化 しようとしていますが、できません サブクラスは.newInstance()でインスタンス化できないのでしょうか? 代替の方法はありますか? ーーーーーーーーーーーーーーーー public class test4121 { public static void main(String[] args) throws Throwable { new test4121(); } public test4121() throws Throwable { //これは実行できるが test4121_2 test = new test4121_2(); //これはできない Class.forName("test4121$test4121_2").newInstance(); } class test4121_2{ } } ーーーーーーーーーーーーーーーー
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- root139
- ベストアンサー率60% (488/809)
No.1 の方も指摘されている通り、 サブクラスではなく内部クラスで、含まれているクラス(test4121)のオブジェクトへの参照を持つ必要が有るので、インスタンス化に失敗したのかと。 内部クラス(のオブジェクト)から含まれているクラス(のオブジェクト)の非staticフィールド・メソッドにアクセスする必要が無いのなら、内部クラスの宣言にstaticを付けることでも、インスタンス化できる様になります。 例) ----------------------------------------------------------------- static class test4121_2{ } ---------------------------------------------------------------------
サブクラスではなくて、内部クラスのことだな。 こいつは、ちょっと難しい。単純にnewInstanceすればいいというわけじゃない。このへんはリフレクションについて理解してないといけないんだが、要するに、コンストラクタのオブジェクトConstructorを取得し、これからnewInstanceすれば内部クラスのインスタンスを動的に取得できるはず。こんな感じ。 Class arg[] = {getClass()}; Constructor c = Class.forName("test4121$test4121_2").getConstructor(arg); Object obj[] = {this}; c.newInstance(obj); 要するに内部クラスのインスタンス生成は、実はJava内部ではそれが含まれているオブジェクトの情報を引数に渡してコンストラクタを呼び出しているため、単純にnewInstanceではnewされない、という仕組みになっているわけだ。