2

ドキュメントに記載されているように、Cglib MethodInterceptor についていくつか混乱があります。生成されたすべてのプロキシされたメソッドは、元のメソッドの代わりにこのメソッドを呼び出します。元のメソッドは、Method オブジェクトを使用して通常のリフレクションによって呼び出すか、MethodProxy (より高速) を使用して呼び出すことができます。

しかし、以下のコードには java.lang.reflect.InvocationTargetException;why? によるエラーの原因があります。アドバイスをいただければ幸いです。

public class CglibInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    System.out.println(" CglibInterceptor do something");
    return method.invoke(obj, args);

}

}

4

1 に答える 1

2

投稿したコードは無限ループを作成します。通常のリフレクションを使用する場合と を使用する場合の違いはMethodProxyMethodProxyがプロキシされたクラスのサブクラス実装を呼び出し、リフレクション呼び出しが再度プロキシされることです。

2 つのオプションは、次のように考えることができます。

 class NormalClass {
   void m() { }
 }

 class CglibClass extends NormalClass {
   void m() {
     // This would be like the reflective invocation
     this.m();
     // This has the same effect as the MethodProxy
     super.m();
   }
 }

問題は、反射呼び出しが動的にバインドされることです。したがって、動的に作成されたサブクラスに過ぎないプロキシに常にヒットします。2 つの呼び出しオプションのいずれかを選択することは、速度に関するものではなく、プロキシをヒットするかどうかに関するものです。

于 2013-12-01T23:29:30.193 に答える