当前位置: 首页 > 知识库问答 >
问题:

关于Cglib代理MethodInterceptor回调参数的问题

赫连法
2023-03-14

在使用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,
      Method method,
      Object[] objects,
      MethodProxy methodProxy) throws Throwable {
  }

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

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

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

共有1个答案

年业
2023-03-14

Javadoc表示:

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

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

 类似资料: