リフレクションを使ってDoubleのコンストラクターを呼び出すプログラムでエラーが出る

このQ&Aのポイント
  • リフレクションを使ってDoubleのコンストラクターを呼び出すプログラムでエラーが発生しています。NoSuchMethodExceptionがスローされ、Doubleクラスに引数がDouble型のコンストラクターが存在しないことが原因です。
  • 原因の一つは、createInstanceメソッドで引数の型を取得する処理が間違っていることです。引数の型を取得する際、引数のオブジェクトのgetClass()メソッドを使用する必要がありますが、現在は引数のオブジェクト自体のクラスを取得しています。
  • 解決策としては、createInstanceメソッドで引数の型を正しく取得するよう修正する必要があります。引数のオブジェクトの型を取得し、それを使用してコンストラクターを取得することで、正しいインスタンスが生成されるようになります。
回答を見る
  • ベストアンサー

コンストラクターの生成でエラーが出ます。

こんにちは、site7(tokopokoからIDを変えました)と言います。 リフレクションを使って、 Double(doulbe)のコンストラクターを呼び出すプログラムを作りました。 しかし、実行するとエラーになります。 原因または解決策をご存知の方はいらっしゃいませんか。 ■プログラム import java.lang.reflect.*; class TestConstructor { public static Class<?> type; public static void main(String[] args) { try { type = Class.forName("java.lang.Double"); Double d = (Double)TestConstructor.createInstance(3.0); System.out.println(d.toString()); } catch (Exception e) { e.printStackTrace(); } } public static Object createInstance(Object... args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { Class<?>[] parameterTypes = new Class<?>[args.length]; for (int i = 0; i < args.length; i++) { parameterTypes[i] = args[i].getClass(); } Constructor<?> constructor = type.getConstructor(parameterTypes); //Constructor<?> constructor = type.getConstructor(double.class); return constructor.newInstance(args); } } ■実行例 D:\>javac TestConstructor.java D:\>java TestConstructor java.lang.NoSuchMethodException: java.lang.Double.<init>(java.lang.Double) at java.lang.Class.getConstructor0(Class.java:2706) at java.lang.Class.getConstructor(Class.java:1657) at TestConstructor.createInstance(TestConstructor.java:21) at TestConstructor.main(TestConstructor.java:7) ■私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.6.0_03"

noname#90015
noname#90015
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#49428
noname#49428
回答No.1

原因は、エラーメッセージの通りです。 Doubleクラスには、Doubleを引数にもつコンストラクタがないからですね。 createInstanceで渡している「3.0」がAutoboxing機能によって暗黙的にDoubleクラスへ変換されるためです。 createInstanceの引数はObject型となってるため、プリミティブ型の引数は受取れませんね。 createInstanceメソッドをプリミティブも渡せるように汎用的にリファクタリングする手段が思いつきません。

noname#90015
質問者

お礼

ありがとうございます。

関連するQ&A

  • JAVAコンストラクタについて

    JAVA のコンストラクタ定義の際に、下記のようにコンストラクタにvoidを付けた時と付けない時の処理結果が変わるのはなぜでしょうか。 (1) class O { protected int d; O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } (2) class O { protected int d; void O(){ System.out.println("O = " + d); } } class Study_6_3main_void { public static void main(String args[]) { int i = 1; O OO = new O(); System.out.println("O = "); } } 実行結果 (1) O = 0 O = (2) O = 以上です。回答の程よろしくおねがいします。

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

    コンパイルはできるのですが、実行するとExption in thread"main"java.lang ArrayIndex0ut0fBoundsExcept ion :0 at java1_1.main(java1_1.java:19と表示をされてしまってできません。教えてください。宜しくお願いします。 /* 実行時引数を受け取り乱数を設定 */ class java1-1 { public static void array_syokika(int a[]) { for(int i = 0; i < a.length; i++) { a[i] = (int)(100 * Math.random()); } } public static void main(String args[]) { int num = Integer.parseInt(args[0]); int a[] = new int[num]; array_syokika(a); for(int i = 0; i < a.length; i++) { System.out.println("a[" + i + "]=" + a[i]); } } }

    • ベストアンサー
    • Java
  • Javaでエラーになります。

    import javafx.application.*; import javafx.stage.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.layout.*; public class Sample2 extends Application { private Label lb; public static void main(String[] args) } launch(args); } public void start(Stage stage)throws Exception {   //コントロールの作成 lb = new Label(); //コントロールの設定 lb.setText("いらっしゃいませ。"); //ペインの作成 BorderPane bp = new BorderPane( ); //ペインへの追加 bp.setCenter(lb); //シーンの作成 Scene sc = new Scene(bp, 300 ,200); //ステージへの追加 stage.setScene(sc); //ステージの表示 stage.setTitle("サンプル"); stage.show(); } } 上記のコードで下記のエラーが出ます。 何処がおかしいのでしょうか? Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: Stage at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetMethodRecursive(Class.java:3048) at java.lang.Class.getMethod0(Class.java:3018) at java.lang.Class.getMethod(Class.java:1784) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) Caused by: java.lang.ClassNotFoundException: Stage at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 more こんな感じです。 何処がおかしいのでしょうか? ご多忙中すいません。 ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • Java何故エラーになるのですか?

    public class Sample3_1 { public static void notMain(String[] args) { System.out.println("not main"); } public static void main (String[] args) { System.out.println("こんにちは、Java"); System.out.println("私の名前は、コウゾウです。"); } } Exception in thread "main" java.lang.Error: Unresolved compilation problems: トークン "Invalid Character" に構文エラーがあります。このトークンを削除してください 構文エラーがあります。"}" を挿入して ClassBody を完了してください at Sample3_1.main(Sample3_1.java:10) "}" を挿入して」と書かれてますが、 "}" には間違いなさそうです。 どなたか解説のほどを宜しくお願い致します。

    • ベストアンサー
    • Java
  • 配列インデックス範囲外エラー?

    以下のようなプログラムを実行しようとしたところ、 java.lang.ArrayIndexOutOfBoundsException というエラーが出ました。 args[0]が、配列の範囲外のインデックスを指しているため出ているようなのですが、 原因がよく分かりません。  基本的なことで申し訳ありませんが、ご教授いただけるとありがたいです。 public class test0708_6 { public static void main(String args[]) { // TODO Auto-generated method stub Cell leftmost_cell = null; int leng = args[0].length();   ← java.lang.ArrayIndexOutOfBoundsException for(int i=1; i<=leng; i++) { leftmost_cell = new Cell(args[0].charAt(leng-i), leftmost_cell); } ・・・省略・・・ } }

    • ベストアンサー
    • Java
  • 沢山のエラーメッセージが表示されます。

    いつも大変お世話になり、誠にありがとうございます。 標記の件。 public class Main2 { public static void main(String[] args) { for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { System.out.println(i * j); System.out.println(" "); } System.out.println(" "); } } } C:\>cd JAVA C:\JAVA>javac Main2.java C:\JAVA>java Main2 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: Main2 has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) どうすればいいでしょうか? ご多忙中恐れ入ります。 ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • arraycopy コンパイルエラー

    javaの勉強をしているのですが arraycopy()を使ったプログラムでエラーが出てしまいます。 class Ex97{ public static void main(String args[]){ int []a = new int[10]; int []b = new int[5]; for(int i=0; i<10; i++){ a[i] = (int)(Math.random()*10); } System.arraycopy(a, 2, b, 0, 5); for(int i=0; 0<a.length-1; i++){ System.out.println(a[i]); } System.out.println(""); for(int i=0; 0<b.length; i++){ System.out.println(b[i]); } } } /*メッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Ex32.main(Ex32.java:13) */ このプログラムはaの3番目の要素から5つ分の内容をbへコピーする というものです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • java(エラーメッセージについて)

    こんにちは。 javaの問題を解いているのですが、エラーメッセージを 解決することができません。 下記のプログラムです。 class Ex30{ public static void main(String args[]){ int week[][] ={ {50,70,80}, {80, 90, 100, 50, 70}, {60, 55, 70, 60} }; char n1[] = {'A', 'B', 'C'}; for(int i=0; i<week[i].length; i++){ System.out.print(n1[i] + "さんは" + week[i].length + "科目受講し、各科目の得点が"); for(int k=0; k<week[i].length; k++) System.out.print(week[i][k] + " "); System.out.println(""); } } } 実行結果 Aさんは3科目受講し、各科目の得点が50 70 80 Bさんは5科目受講し、各科目の得点が80 90 100 50 70 Cさんは4科目受講し、各科目の得点が60 55 70 60 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Ex30.main(Ex30.java:7) どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • コンストラクタで設定した値が表示されない

    以下のプログラムを見ていただけたら分かるとおり、コンストラクタで設定した値が、配列だと表示されるのに、配列を使用していない変数だと表示されません。なせなのでしょうか? よろしくお願いします。 package test; public class test { public test(int[] idt, double ddt, String title) { title = "テスト"; ddt = 99.9; for(int i=0; i<idt.length; i++) { idt[i] = i; } } public static void main(String[] args) { int[] idt = {0, 0, 0}; double ddt=0.0; String title= ""; test t = new test(idt, ddt, title); for(int i=0; i<idt.length; i++) { System.out.println(idt[i]); } System.out.println(ddt + ", " + title); } }

    • ベストアンサー
    • Java
  • プログラムコードを書いて実行するとエラーが起きる

    今JAVAのプログラムの勉強(初心者)をしているのですが、とある参考書のプログラムコードを書いて実行すると Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at rensyu7.pkg1.Rensyu71.main(Rensyu71.java:18) Java Result: 1 というエラーが起きておりどこがエラーなのかコードを眺めてみたのですがよくわかりません。 クラス: Rensyu71 package rensyu7.pkg1; import java.lang.reflect.*; public class Rensyu71 { /////////////////////////////////////////////////////////////////////////////// // mainメソッド ////////////////////////////////////////////////////////////////////////////// public static void main (String[] args) { String FQCN = args[0]; String hairetu = args[1]; try { Class<?>class1 = Class.forName (FQCN); listMethods (class1); //listMethodsの呼び出し if (hairetu.equals ("E")) { launchInternal (class1); //launchInternalメソッドの呼び出し }else if(hairetu.equals ("I")){ launchInternal (class1); //launchInternalメソッドの呼び出し }else{ throw new IllegalArgumentException ("起動方法が不正です"); } } catch (Exception e) { System.out.println (e.getMessage ()); e.printStackTrace (); System.exit (1); } showmemory (); //showmemoryの呼び出し System.exit (0); } /////////////////////////////////////////////////////////////////////////// // listMethodsメソッド //////////////////////////////////////////////////////////////////////////// public static void listMethods(Class<?>class1){ System.out.println ("メソッド一覧を表示します"); Method[]hairetu2 = class1.getDeclaredMethods (); for (Method m : hairetu2) { System.out.println (m.getName ()); } } //////////////////////////////////////////////////////////////////////////// // launchExternalメソッド //////////////////////////////////////////////////////////////////////////// public static void launchexternal(Class<?>class1) throws Exception{ ProcessBuilder PB = new ProcessBuilder ("java",class1.getName ()); Process process = PB.start (); process.waitFor (); } //////////////////////////////////////////////////////////////////////////// /// launchInternalメソッド //////////////////////////////////////////////////////////////////////////// public static void launchInternal(Class<?>class1)throws Exception{ Method m = class1.getMethod ("main", String[].class); String[] args = {}; m.invoke (null, (Object)args); // } //////////////////////////////////////////////////////////////////////////////// // shoememoryメソッド /////////////////////////////////////////////////////////////////////////////// public static void showmemory(){ long free = Runtime.getRuntime ().freeMemory (); long total = Runtime.getRuntime ().totalMemory (); long memorisiyouryou = (total-free)/1024/1024; System.out.println ("現在のメモリの使用量:"+memorisiyouryou+"MB"); } } ============================================================================ クラス:MemoryEater package rensyu7.pkg1; public class MemoryEater { public static void main (String[] args) { System.out.println ("eating memory・・・・・・・"); long[] larry = new long[128000]; for (int i = 0; i <larry.length; i++) { larry[i]=i; } } } 滅茶苦茶なプログラムですが、初心者ですので大目にみてください。 どこを直せば実行できますか?どなたかご教授願います。

    • ベストアンサー
    • Java

専門家に質問してみよう