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() 处设置了一个断点并进入它。我截图了:

when the intercept method is called

问题methodmethodProxy 参数是什么?它们之间有什么区别?当我使用methodProxy调用时,它也起作用,这让我很困惑。

Object obj = method.invoke(target,objects);

// This also works,why?
// Object obj = methodProxy.invoke(target,objects);

解决方法

Javadoc 说:

原始方法可以使用 Method 对象通过正常反射调用,也可以使用 MethodProxy(更快)调用。

我不知道是什么让它更快。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...