混淆Cglib MethodInterceptor调用方法

时间:2013-01-20 03:30:32

标签: java aop cglib

我对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);

}

}

1 个答案:

答案 0 :(得分:1)

您发布的代码创建了无限循环。使用普通反射和MethodProxy之间的区别在于MethodProxy将调用代理类的子类实现,而反射调用将再次代理。

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

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

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