※ ChatGPTを利用し、要約された質問です(原文:リフレクション Method.invoke() 時のインスタンス変数)
リフレクション Method.invoke() 時のインスタンス変数
このQ&Aのポイント
リフレクションAPIを使用してフレームワークを使いやすく構築しようとしている際に、Method.invoke()でbeanクラスのメソッドを呼び出す際にインスタンス変数の値が正しく取得できない問題が発生しています。
invokeしたメソッド内で自分自身のインスタンス変数の値を取得することはできないのでしょうか。
invokeの引数にbeanを渡しているため、インスタンス変数の値を取得できると思っているが、デバッグした結果、メソッド内でのインスタンス変数の値は全てnullとなってしまっている。
リフレクション 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 を渡しているから、取れる気がするのですが、、
お分かりになればどうかご教示ください。
以上、よろしくお願いいたします。
お礼
ご回答ありがとうございます。 こちら色々と試している内に、おおよその原因がわかりました。 bean オブジェクトを springframework の管理下に置いているのですが、 public メソッド(valid)に対して aop によるインターセプトが発生し、 予期せぬ動作になっているようです。 public final とし、spring 側でオーバライドできなくすれば、 期待通りの動きになるようですが、それはそれで業務側でオーバライドできなくなってしまうため、現在別の策を調査中です。 大変お手数おかけしました。 こちらのソースコードも参考にさせていただきます。