• 締切済み

サブクラスで.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{ } } ーーーーーーーーーーーーーーーー

noname#86217
noname#86217
  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

No.1 の方も指摘されている通り、 サブクラスではなく内部クラスで、含まれているクラス(test4121)のオブジェクトへの参照を持つ必要が有るので、インスタンス化に失敗したのかと。 内部クラス(のオブジェクト)から含まれているクラス(のオブジェクト)の非staticフィールド・メソッドにアクセスする必要が無いのなら、内部クラスの宣言にstaticを付けることでも、インスタンス化できる様になります。 例) ----------------------------------------------------------------- static class test4121_2{ } ---------------------------------------------------------------------

noname#94983
noname#94983
回答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

  • 内部クラスのインスタンスを動的に取得したい

    class test {   public test(String str){     try{       Class c = Class.forName("test$TESTSUB" + str);       c.newInstance();  // ココでエラー     }catch(Exception e){       e.printStackTrace();     }   }   public static void main(String[] args){     new test(args[0]);   }   class TESTSUB1 {     public TESTSUB1(){       System.out.println("# " + toString());     }   }   class TESTSUB2 {     public TESTSUB2(){       System.out.println("# " + toString());     }   } } 上記のようなコードにより、内部クラスのインスタンスを 動的に得たいと思っていますが、エラーとなってしまいます。 エラー回避方法、または他にいい方法がありましたら、 ご教示のほどよろしくお願いいたします。

    • ベストアンサー
    • Java
  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java
  • サブクラスからメインメソッドの値を参照するとき

    サブクラスからメインのメソッドを参照する時にメインプログラムが二重起動してしまってどうしたらいいのかわかりません。 プログラムは メインクラスが public class MainProg{ 初期定義など public MainProg() {    プログラム中身 } public String Month{ return A; } public static void main(String [] args) { new MainProg(); } } サブクラスが public class Transmission{        一部省略 MainProg main = new MainProg(); String Month = main.Month(); } このようになっているんですが メインクラスで使用している値をサブクラスで参照しようとしたときにメインクラスがもう一度呼び出されてしまいます。 どのようにしたらいろいろ操作してみたんですが、どうにも解決法がわかりません。 お願いします。

  • Java 型指定を伴わないインスタンスの作成?

    問題集で以下のプログラム(一部)を見かけました。 class Test{ public static void main(String args[]){ new Animal("A"); } } Animalクラスのインスタンスを作成しているということなのですが、 これまでであれば、 Animal a = new Animal(); というようにイコールの左で インスタンスの型と変数を指定する形で学んで来ました。 型や変数を指定しないでインスタンスの作成をすることが できるのですか? 回答をお願いします。

    • ベストアンサー
    • Java
  • staticつきのインナークラスのインスタンスについて

    以下のようにTestクラス内にstaticなSIクラスを作成しました。 SIクラスのmethodSI()を呼び出す際に、 ( ( new Test() ).new SI() ).methodSI(); のように呼び出しを行おうとすると、エラーになります。 その原因を教えてください。 public class Test{   static class SI{     void methodSI(){       System.out.println( "method si" );     }   }   public static void main( String args[] ){ //次の行↓     ( ( new Test() ).new SI() ).methodSI(); //以下は全て成功します。     (new Test()).SI();     ( new Test.SI() ).methodSI();     ( new SI() ).methodSI();   } }

  • インスタンスの情報表示について

    Java初心者です。 例えば次のようなソースがあって、double型の変数numの情報を表示するためにtoStringをオーバーライドするとすると、どのようにすればStringを返せるのでしょうか。 public class Test { private double[] num; public Test(double a, double b, double c) { num = new double[3]; this.num[0]=a; this.num[1]=b; this.num[2]=c; } public toString() { // return "インスタンスは: "+ } public static void main(String args[]) { Test a = new Test(4.3, 5.6, 12.7); System.out.println(a.toString()); } }

  • mainの中に、mainを含んでいる場合の動作が分かりません

    class Test{ public static void main(String args[]){ ObjectVector vect = new ObjectVector(); vect.at(0, "HogeHoge"); vect.at(1, new Test()); String str1 = (String)vect.at(0); String str2 = (String)vect.at(1); } } このサンプルプログラムで、「Testクラスのインスタンス」がObjectVectorに入っているのですが、Testクラスはmain()を含んでいるのでmainの中に、mainを含んでいる場合の動作が分かりません。教えてください。

    • ベストアンサー
    • Java
  • コンストラクタ内で定義したインスタンスの呼び出し。

    以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンスehogeを set_vのところで使おうとすると”ehogeを解決できません” というエラーが出てしまいます。 初歩的な質問ですが、 ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか? public class sample { void sample(){ hoge ehoge=new hoge(); } public static void main(String[] args) { } void set_v(){ int num=ehoge.value(); } } class hoge{ int value=1; }

    • ベストアンサー
    • Java
  • javaの質問です。

    明日JavaのBronze試験を受けに行くのですが、全然わからずに困っています。 紫色のJavaプログラマBronzr[SE7]という本を使用しています。 本の模試の問題です。 37 Class Super{ static void method(){ System.out.println("Super"); } } Class Sub extends Super{ static void method(){ System.out.println("Sub"); } } Class Test { public static void main(String[] args){ Super obj = new Sub(); obj.method(); } } この問題はSuperが表示されるらしいのですが、理由がわかりません。 サブクラスをインスタンス化しているので、Subが表示されるというのなら理解できます。staticが関係あるのはなんとなくわかるのですが、、、、、、なぜSuperなのかがわかりません。 解答ではスーパークラスの型にサブクラスを入れているからと簡単に書いてあります。 詳しく説明していただけると助かります。

    • ベストアンサー
    • Java
  • インスタンス変数について

    JAVA勉強中のものです。 インスタンス変数についてわからないのですが、 class Data{int d;} classSample{ public static void main(String[] args){ Data data1 =new Data(); Data data2 =new Data(); data1.d = 100; data2 = data1; data2.d = 200; System.out.println(data1.d); } } 実行すると200が表示されますが、new演算子によってできたオブジェクトの実体を参照する ID がdata1およびdata2に入るのは理解できるのですが、 インスタンス変数のdはメモリ上でどう設定されているかイメージがわきません。 わかる方どうぞ教えて下さい。

    • ベストアンサー
    • Java