• ベストアンサー

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
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

リフレクションを使う必要のないプログラムだったらどうやるか考えてみてください。 x.setLstData(...); 他の処理 obj = x.getLstData(...); setLstData()を呼んでからgetLstData()を呼ぶまでの間にx=new XXX();を実行することはありませんよね? それと同じです。 getLstData()を呼ぶまで、値がセットされたオブジェクトへの参照をどこかに残しておけばいいのです。 > java.lang.IllegalArgumentException: object is not an instance of declaring class このエラーはMethod.invoke()で出ているものでしょうか? もしそうなら、メッセージのとおりinvoke()に渡しているレシーバオブジェクトのクラスが合っていないだけだと思われます。 つまり、クラスAのメソッドをinvoke()するのに、クラスBのオブジェクトをレシーバに指定している && クラスBはクラスAと継承関係がない、とか。

muu731u
質問者

お礼

回答ありがとうございます。 >値がセットされたオブジェクトへの参照をどこかに残しておけばいいのです。 原因として、オブジェクトではなく、Classを持ちまわってたので できませんでした。オブジェクトにすることで解決しました。 ありがとうございます。

その他の回答 (1)

  • world99
  • ベストアンサー率64% (20/31)
回答No.2

こんにちは。 まず、値の取得についての質問の回答ですが、 リフレクションを使い値をセットするクラスと、 セットした値を取得するクラスのインスタンスを同じにします。 例外は、JavaAPIに「不正な引数、または不適切な引数をメソッドに渡したことを示すためにスローされます。」と記述があるので、恐らく値の設定メソッドを呼び出す際に、引数の指定がないからだと思います。 サンプルのプログラムを作ってみましたので、確認してみて下さい。 public class QA4714393 { private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } public static void main(String[] args) { Method method; try { QA4714393 clazz = QA4714393.class.newInstance(); method = QA4714393.class.getMethod("setData", String.class); method.invoke(clazz, "100"); method = QA4714393.class.getMethod("print"); method.invoke(clazz); } catch (Exception e) { e.printStackTrace(); } } public void print() { System.out.println(getData()); } }

muu731u
質問者

お礼

回答ありがとうございます。 解決しました。 サンプルありがとうございます。参考にさせていただきます。

関連するQ&A

  • リフレクション

    リフレクションによって、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
  • リフレクション

    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
  • 外部jarの標準出力を取得できますか?

    ClassLoaderで外部jarのクラスをロードし、実行するプログラムを作りました。 SimpleOutputは、単に渡された引数を標準出力に出すだけのものです。 この値を取得してGUI上に表示させたいのですが、取得する方法をご教授ください。 System.out.println("Load class"); URL[] urls = { file.toURI().toURL() }; ClassLoader loader = URLClassLoader.newInstance(urls); Class<?> cls = loader.loadClass("SimpleOutput"); System.out.println(cls); Object obj = cls.newInstance(); Method method = cls.getMethod("main", String[].class); String[] av = {"test"}; method.invoke(obj, new Object[]{av});

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

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

    • ベストアンサー
    • Java
  • リフレクション Method.invoke() 時のインスタンス変数

    現在リフレクションAPIを使用してフレームワークを 使いやすく構築しようとしているのですが、 以下の例の抜粋コードで、一点わからないことがあります。 1:Object bean = beanField.get(action); 2:Class<?> beanClass = bean.getClass(); 3:Method validMethod = beanClass.getMethod("valid"); 4:if (void.class.equals(validMethod.getReturnType())) { 5: // void 型 6: validMethod.invoke(bean); 7:} 6行目の invoke() で bean クラスの valid メソッドを呼び出しています。この時点でデバッグしたところ、bean が保持しているインスタンス変数に値が正常に格納されているのですが、 実際に bean.valid() メソッド内にデバッグが進んだ時、bean 内のインスタンス変数が全て null となってしまっています。 invoke したメソッド(ここではvalid)内で、自分自身(bean)のインスタンス変数値を取得することはできないのでしょうか。 invoke の引数に bean を渡しているから、取れる気がするのですが、、 お分かりになればどうかご教示ください。 以上、よろしくお願いいたします。

    • ベストアンサー
    • 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
  • VC++/MFCでリフレクション

    Javaでは、ObjectのgetClass()でClassクラスの インスタンスが取れ、実行時に指定した、メソッド名や、引数で、動的にメソッドを呼びだすようなリフレクション機能が使用できます。 同様のことをC#でも実装したことがあります。 VC++/MFCにて、このようなリフレクションをやるやり方を教えてください。 C++の標準あるいわ、MFCの機能など、どちらでもよいです。 メタクラス型のようなものを実行時に取得して、リフレクションする方法だと思います。 質問の内容はVC++.NETやVC++/CLIではないです。そちらのほうでのやり方は既に発見しました。

  • C#の動的キャスト

    いつもお世話になっています。 C#の動的キャストに関する質問です。 C#のメソッドにobjectの引数を渡して動的にキャストする場合 void Hoge(object obj) { Type t = Type.GetType(obj); objの型 obj2 = (objの型)Convert.ChangeType(obj, t); //(1) ................................. } のようにされています。 しかし多様性をもつobjcetを引数にする多くの場合は「objの型」は不定です。 逆に言えば「objの型」がわかっている場合はわざわざobjectを引数にする必要はないわけです。 そこで質問ですが、何とかType t から「objの型」を取得して(1)記法による動的キャストを行う方法はないでしょうか? GetMethod, GetPropertyでメソッド,プロパティを取得し、Invoke, GetValue, SetValueすることは可能ですが、できればドット記法(.)が使える (1) のような動的キャストを行いたいと考えています。 よろしくお願いします。

  • 指定されたクラスの継承元の確認方法

    Class cls = Class.forName("extendsClass"); Object obj = cls.newInstance(); if (obj instanceof AbstractClass) {   System.out.println("継承してた");   ((AbstractClass)obj).method(); } こんなことをして、objのクラスがAbstractClassを継承しているという ことは確認することが出来たのですが、これはやはり継承しているか どうかを確認する為にインスタンス化を行っています。 指定された名称のクラスが、特定のクラスを継承していた場合に限り、 その名称のクラスをインスタンス化する、 という流れは行えないのでしょうか?

    • ベストアンサー
    • Java
  • リフレクションでフィールドに値を設定

    リフレクションで取得したクラスの一覧の各クラスのString型のフィールドにだけ 任意の値を設定するサンプルを下記のように作成しました。 このプログラムの流れの中でString型のフィールドに任意の値を設定するには どのように書けばよいでしょうか。 調べてみるとFieldクラスのsetメソッドを使用するようですが下記サンプルの中で 第一引数には何を渡せばよいかがわからないです。 【サンプル】 ※最初のgetClasses()で指定パッケージ配下のクラスは取得できています。 import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; public class ReflectionTest { public static void main(String[] args) { List<Class<?>> classes; try { // 指定したパッケージ配下のクラスを取得 classes = getClasses("test"); for (Class<?> class1 : classes) { Field[] fields = class1.getDeclaredFields(); for(Field field : fields) { field.set(????, "任意の文字列"); // 第一引数に何を渡せばよい?? System.out.println(field.getType().getName()); } } } catch (ClassNotFoundException | IOException | URISyntaxException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java