• 締切
  • 困ってます

サブクラスで.newInstance()でインスタンス化できない

  • 質問No.4856893
  • 閲覧数1151
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0
以下のように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件)

  • 回答No.2

ベストアンサー率 60% (488/809)

No.1 の方も指摘されている通り、サブクラスではなく内部クラスで、含まれているクラス(test4121)のオブジェクトへの参照を持つ必要が有るので、インスタンス化に失敗したのかと。

内部クラス(のオブジェクト)から含まれているクラス(のオブジェクト)の非staticフィールド・メソッドにアクセスする必要が無いのなら、内部クラスの宣言にstaticを付けることでも、インスタンス化できる様になります。
例) -----------------------------------------------------------------
static class test4121_2{
}
---------------------------------------------------------------------
  • 回答No.1
サブクラスではなくて、内部クラスのことだな。

こいつは、ちょっと難しい。単純にnewInstanceすればいいというわけじゃない。このへんはリフレクションについて理解してないといけないんだが、要するに、コンストラクタのオブジェクトConstructorを取得し、これからnewInstanceすれば内部クラスのインスタンスを動的に取得できるはず。こんな感じ。

Class arg[] = {getClass()};
Constructor c = Class.forName("test4121$test4121_2").getConstructor(arg);
Object obj[] = {this};
c.newInstance(obj);

要するに内部クラスのインスタンス生成は、実はJava内部ではそれが含まれているオブジェクトの情報を引数に渡してコンストラクタを呼び出しているため、単純にnewInstanceではnewされない、という仕組みになっているわけだ。
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ