如何解决Cglib代理MethodInterceptor回调参数问题
在使用Spring Cglib代理时,我们需要实现一个MethodInterceptor回调,我对这个回调有一些问题。为了更清楚,让我们举一个简单的例子。
这是我的目标类 MyPlay.java
public class MyPlay {
public void play() {
System.out.println("MyPlay test...");
}
}
我创建了一个回调:
public class CglibMethodInterceptor implements MethodInterceptor {
private Object target;
public CglibMethodInterceptor(Object target) {
this.target = target;
}
public Object getProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(
Object o,Method method,Object[] objects,MethodProxy methodProxy) throws Throwable {
System.out.println("CGLIB prep work...");
Object obj = method.invoke(target,objects);
System.out.println("CGLIB post work...");
return obj;
}
}
在我的主类中:
MyPlay myPlay = new MyPlay();
cglibMethodInterceptor = new CglibMethodInterceptor(myPlay);
Play myPlayProxy = (Play) cglibMethodInterceptor.getProxy();
myPlay.play();
myPlayProxy.play();
我对intercept方法参数的含义感到困惑:
@Override
public Object intercept(
Object o,MethodProxy methodProxy) throws Throwable {
}
所以,我在 myPlayProxy.play() 处设置了一个断点并进入它。我截图了:
问题:method
和 methodProxy
参数是什么?它们之间有什么区别?当我使用methodProxy调用时,它也起作用,这让我很困惑。
Object obj = method.invoke(target,objects);
// This also works,why?
// Object obj = methodProxy.invoke(target,objects);
解决方法
Javadoc 说:
原始方法可以使用 Method 对象通过正常反射调用,也可以使用 MethodProxy(更快)调用。
我不知道是什么让它更快。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。