2

正如文档描述的那样,我对 Cglib MethodInterceptor 有一些困惑:所有生成的代理方法都调用此方法而不是原始方法。原始方法可以使用 Method 对象通过正常反射调用,也可以使用 MethodProxy(更快)调用。

但是下面的代码有 java.lang.reflect.InvocationTargetException 引起的错误;为什么?任何建议将不胜感激。

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将调用被代理类的子类实现,而反射调用将被再次代理。

您可以考虑以下两个选项:

 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();
   }
 }

问题是反射调用是动态绑定的。因此,它们总是会命中代理,而代理只不过是一个动态创建的子类。选择两个调用选项之一与速度无关,它与您是否要访问代理有关。

于 2013-12-01T23:29:30.193 回答