动态代理的invoke函数为什么需要一个代理实例参数呢

请问实现InnovationHandler接口的动态代理类中的invoke函数参数为什么要接收一个Proxy代理实例对象呢,好像用不到这个对象。

阅读 2.8k
2 个回答

相信这篇可以解决你的困惑:

https://stackoverflow.com/que...

简单说下我的理解:

  1. 大部分时候你不会用到这个参数
  2. 它表示的是代理类的真实代理对象,com.sun.proxy.$Proxy0
  3. 可以将代理对象返回以进行连续调用

动态代理类,是在类上做代理,而不是在对象上,方法的调用最终是要在对象上的。

比如说这样一个类:

public class User {
    private int age;
    // setter getter;
    
    public User() {}
    
    public User(int age) {
        this.age = age;
    }
    
    public void println() {
        System.out.println("age:" + this.age);
    }
}

看这样一个代理类,对println做处理:

public UserInvocationHanlder implements InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
            method.invoke(proxy, args)
        }
}

  1. 首先,method.invoke(proxy, args),方法的调用必须传入当前实例(静态方法除外)
  2. 假设,没有对象实例,那method调用的时候,new User(3)new User(5),打印的应该设什么呢?

所以,最终还是回到method.invoke(proxy, args),方法的调用,必须传入当前实例(静态方法除外)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题