リフレクションでStringの値を各クラスのオブジェクトに変換する方法

このQ&Aのポイント
  • リフレクションを使用して、Stringの値(strVal)を各クラスのオブジェクトに変換したい場合、静的メソッドはgetMethodでは取得・実行できないため、別の方法を考える必要があります。
  • このコードでは、clazz.getMethod部分でNoSuchMethodExceptionが発生してしまっています。このエラーは、clazzがStringクラスではないため、valueOfメソッドを取得できないことを示しています。
  • 解決策として、clazzがStringクラスであることを確認し、StringクラスであればgetMethodを使用できます。また、clazzがString以外のクラスである場合は、別の方法(例えば、文字列をオブジェクトに変換するメソッドを使用する)を検討する必要があります。
回答を見る
  • ベストアンサー

リフレクション

リフレクションによって、Stringの値(strVal)を各クラスのオブジェクトに変換したいと思っております。 下のようなコードで、this.typeにセットしてあるオブジェクトのvalueOfメソッドを実行したいのですが、clazz.getMethod部分で次のようなExceptionが発生してしまいます。 staticメソッドはgetMethodでは取得・実行できないのでしょうか? ご存知の方いらっしゃいましたら、教えて頂けないでしょうか。 【Exception】 java.lang.NoSuchMethodException: java.lang.String.valueOf() 【コード】 Class clazz = Class.forName(this.type); Method method = clazz.getMethod("valueOf", new Class[0]); return method.invoke(clazz.newInstance(), new Object[]{strVal} ); 今回、this.typeには、"java.lang.String"が入っています。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.1

StringクラスのgetMethodには引数なしのメソッドは存在しません。 だからNoSuchMethodExceptionが返ってるのではないでしょうか?

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/String.html
javatomo
質問者

お礼

ありがとうございます。 ご指摘いただいたとおりでした。

関連するQ&A

  • リフレクション

    Webアプリ上でリフレクションにてとあるクラスのメソッドを実行するサンプルを作成して 見たのですがうまく動きませんでした。最後のmethod.invoke()の処理にてExceptionが発生し、 java.lang.IllegalArgumentException: object is not an instance of declaring class と表示されてしまいます。 作成したサンプルは下記なのですがどこが原因かお分かりになりますでしょうか。 try { Class cls = Class.forName("dao.TestDao"); // 引数の型をセット Constructor constructor = cls.getDeclaredConstructor(HttpSession.class); constructor.setAccessible(true); // 引数を渡してオブジェクトを生成 Object obj = constructor.newInstance(session); Method method = cls.getDeclaredMethod("getDataDao", int.class); method.setAccessible(true); Object result = method.invoke(cls, new Integer(100)); } catch (Exception e) { e.printStackTrace(); } // このクラスのgetDataDao()をリフレクションにて実行 public class TestDao { HttpSession session = null; public TestDao(HttpSession session) { this.session = session; } public List<String> getDataDao(int iNo) { List<String> list = new ArrayList<String>(); list.add((String)session.getAttribute("1")); list.add((String)session.getAttribute("2")); list.add((String)session.getAttribute("3")); list.add((String)session.getAttribute("4")); list.add((String)session.getAttribute("5")); return list; } }

    • ベストアンサー
    • Java
  • リフレクション 可変長引数メソッドの取得

    リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか? //JDK 6.0 public Hoge { void method1(String str, Object ...objs){}//(1) void method1(String str, String str2){}//(2) } Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method", String.class, String.class); Method m11 = c.getMethod("method", ?? );

    • ベストアンサー
    • Java
  • Java リフレクションについて

    1.リフレクションを使い、値をセット(BeanのSetterメソッドにて) 2.1でセットした値を取得するために、下記コードで取得 Method Method = Class.getMethod("getLstData"); Object obj = Method.invoke(****); 上記の****の箇所には、メソッドのあるクラスのインスタンスを渡す、 というところまでは分かりますが、newInstance()してしまうと、新しいオブジェクトになってしまうので 値が取得できません。 error>>java.lang.IllegalArgumentException: object is not an instance of declaring class どのようにすれば、値の取得が可能でしょうか。 どなたかご教授いただければと思います。 ※Java 1.5を使用

    • ベストアンサー
    • Java
  • 下記のコードを実行すると、Main.javaの

    下記のコードを実行すると、Main.javaの Command aCommand = new SimpleCommand(receiver, "action"); で、処理されない例外の型 NoSuchMethodExceptionでエラーが発生してしまうのですが、何が悪いのでしょうか?御教示お願い致します。 //ここから public abstract class Command { public abstract void execute(); } public class MyClass { public MyClass() { // } } public class SimpleCommand extends Command { public SimpleCommand(Object receiver, String action) throws NoSuchMethodException, SecurityException { _receiver = receiver; _action = action; _class = _receiver.getClass(); _method = _class.getMethod(action, null); } public void execute() { try { _method.invoke(_receiver, null); } catch (Exception e) { } } private Object _receiver; private String _action; private Class _class; private java.lang.reflect.Method _method; } public class Main { public static void main(String[] args) { MyClass receiver = new MyClass(); Command aCommand = new SimpleCommand(receiver, "action"); aCommand.execute(); } } //ここまで よろしくお願い致します。

    • ベストアンサー
    • Java
  • リフレクションでフィールドのインスタンス取得

    リフレクションを使ってフィールドの型やオブジェクトのタイプ、名前などは取得できるのですが、それ自身のインスタンスを取得できません。 ClassオブジェクトのnewInstanceでは、新しく作ってしまうのでだめでした。なにかよい方法はないでしょうか? class Parent{ Foo foo1,foo2; Bar bar; } というクラスでbarからfoo1,foo2のメソッドを呼び出したいのですが、 Fooは何個定義されるかわからない状態です。 Barないでリフレクションを使ってfoo1,foo2をあらわすClassやFieldは取得できるのですが、foo1,foo2自身が取得したいのです。 よろしくお願いします

    • ベストアンサー
    • Java
  • コマンドプロンプトを使用して。

    よろしくお願いいたします。ネット上にあったサンプルコードをコンパイルし、実行したところ 「Exception in thread "main"java.lang.NoSuchMethodError: main」というメッセージが表示されたのですがどういうことなのでしょうか? コードは以下の通りです。わかる方いましたらよろしくお願いいたします。 public class Sample { public static void main(String[] args1,String[] args2) { MyObject object = new MyObject(); object.setName("mikel"); String s = object.getName(); System.out.println(s); } } class MyObject { String name; public void setName(String str) { name = str; } public String getName() { return name; } }

    • ベストアンサー
    • 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
  • public でないObjectはXMLEncoderで書き出せない?

    PublicでないObjectは、XMLEncoderで書き出せないのでしょうか? 以下のような処理を作成し、実行するとIllegalAccessExceptionが発生してしまいます。 PublicでないObject(Data)に対して、seAccessible(true)が設定できればいけそうなのですが、やり方がわからず悩んでいます。 class Data implements java.io.Serializable { public String m = "a"; public Data() { } public static void main (String args[]) throws Exception { Data data = new Data(); XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("/tmp/data.xml"))); e.writeObject(data ); e.close(); } } # java Data java.lang.IllegalAccessException: Class java.beans.Statement can not access a member of class Data with modifiers "public" Continuing ... java.lang.Exception: discarding statement XMLEncoder0.writeObject(Data0); Continuing ...

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

    こんにちは、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"

    • ベストアンサー
    • 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

専門家に質問してみよう