我对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);
}
}
答案 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();
}
}
问题是反射调用是动态绑定的。因此,它们总是会触及代理,而代理只不过是动态创建的子类。选择两个调用选项之一不是关于速度,而是关于你是否想要命中代理。