プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (2件)

リフレクションを使う必要のないプログラムだったらどうやるか考えてみてください。



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と継承関係がない、とか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

お礼日時:2009/02/16 10:15

こんにちは。



まず、値の取得についての質問の回答ですが、
リフレクションを使い値をセットするクラスと、
セットした値を取得するクラスのインスタンスを同じにします。

例外は、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());
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/02/16 10:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!