• ベストアンサー

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を使用

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

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

お礼

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