当使用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();
我对截取方法参数的含义感到困惑:
@Override
public Object intercept(
Object o,
Method method,
Object[] objects,
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);
1条答案
按热度按时间fsi0uk1n1#
javadoc说:
原始方法可以通过使用method对象的正常反射调用,也可以通过使用methodproxy(更快)调用。
我不知道是什么让它更快。