0

Java で動的プロキシを学習しようとしています。

それらがどのように機能するかは知っていますが、私の問題の解決策を見つけることができません: インターフェイスと、メソッド a()、b() および c() を使用したその実装がネストされている場合 (a() が b( を呼び出すとしましょう) ) c()) を呼び出します。オブジェクトをプロキシして、メソッドへの各呼び出しをログに記録したいと思います。

そのため、実行前にログ行を出力する invoke() メソッドなどの InvocationHandler をコーディングします。

しかし、proxy.a() を呼び出すと、メソッド a() の呼び出しのみが記録され、メソッドのチェーン全体は記録されません。

私は何が欠けていますか?プロキシのターゲットはプロキシ自体でなければなりませんか?

4

2 に答える 2

2

オブジェクト自体はプロキシされていることを認識していないため、a() が b() を呼び出すと、通常の「オブジェクト内」呼び出しになります。

プロキシのターゲットがプロキシ自体である場合、ループが発生します。

これを解決する 1 つの方法は、本当に必要な場合は、デリゲートをターゲット オブジェクトに導入し、プロキシまたはそれ自体をデリゲートとして設定することです。奇妙ですが、うまくいくかもしれません。ただし、ループに注意してください。

于 2012-02-23T11:29:27.550 に答える
2

これは、テスト コードから を呼び出しているのにproxy.a()、最終的なa()メソッドが を呼び出しているのではなくproxy.b()、直接自分のインスタンスを呼び出しているためb()です。

回避策として、デリゲート インスタンスを渡すすべてのメソッドをオーバーロードできます。MyClass のクラス名と MyInterface のインターフェイス名を想定します。

void a() {
   //to keep the non-proxy working, the default method have to pass the 
   //self intance
   a(this);
}
void a(MyInterface target) {
   target.b(target);
}

void b() {
   b(this);
}
void b(MyInterface target) {
   target.c(target);
}
void c() {
   c(this);
}
void c(MyInterface target) {
   //do whatever
}

proxy.a(proxy)次に、テスト コードから を呼び出して、期待される結果を得ることができます。

于 2012-02-23T11:32:12.267 に答える