关于cglib代理methodinterceptor回调参数的java问题

kx7yvsdv  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(349)

当使用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);
fsi0uk1n

fsi0uk1n1#

javadoc说:
原始方法可以通过使用method对象的正常反射调用,也可以通过使用methodproxy(更快)调用。
我不知道是什么让它更快。

相关问题