電子書籍の厳選無料作品が豊富!

現在リフレクション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 を渡しているから、取れる気がするのですが、、

お分かりになればどうかご教示ください。
以上、よろしくお願いいたします。

A 回答 (1件)

うまくいくはずですが?


beanクラスも提示したほうが回答が得られると思いますが?

// main
package sample;

import java.lang.reflect.Method;

public class Test {
public static void main(String[] args) {
try {
Bean bean = new Bean();
System.out.println("value: " + bean.value);
bean.setValue();
System.out.println("value: " + bean.value);
Method method = Bean.class.getMethod("valid");
if( void.class.equals(method.getReturnType()) ) {
method.invoke(bean);
System.out.println("value: " + bean.value);
}
} catch( Exception e ) {
e.printStackTrace();
}
}
}

// bean
package sample;

public class Bean {
public String value = null;

public void setValue() {
this.value = "test";
}

public void valid() {
this.value = "sample";
}
}
    • good
    • 0
この回答へのお礼

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

こちら色々と試している内に、おおよその原因がわかりました。
bean オブジェクトを springframework の管理下に置いているのですが、
public メソッド(valid)に対して aop によるインターセプトが発生し、
予期せぬ動作になっているようです。

public final とし、spring 側でオーバライドできなくすれば、
期待通りの動きになるようですが、それはそれで業務側でオーバライドできなくなってしまうため、現在別の策を調査中です。

大変お手数おかけしました。
こちらのソースコードも参考にさせていただきます。

お礼日時:2009/08/24 15:40

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