jdk动态代理的底层实现

动态代理

生成动态对象的实现,需要传三个参数

  1. 真实对象的类加载器
  2. 真实对象的实现的所有接口
  3. 你想要实现的代理策略(代理方法)
public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),//类加载器,用来生成类
                target.getClass().getInterfaces(), //接口类型,实现所有的接口
                new InvocationHandler() {   //事情处理
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("JDK 代理开始~~");
                        Object returnVal = method.invoke(target, args);  //执行原来的方法
                        System.out.println("JDK 代理提交");
                        return returnVal;//方法的返回值
                    }
                });
    }

源码参考自 https://cloud.tencent.com/developer/article/1076131

  1. 先根据传进的 ClassLoader(类加载器) 和 interfaces(接口) 生成代理类

    • 代理类 继承自 Proxy类 (后序还要调用Proxy类的处理器来执行代理方法)
    • 实现了 用户自定义的 接口(为了获取接口的信息)
  2. 代理类内部会调用Proxy的构造方法设置处理器 InvocationHandler

    • public ProxySubject(InvocationHandler paramInvocationHandler)throws {
          super(paramInvocationHandler);  //调用Proxy的构造方法设置处理器
        }
      
      
  3. 代理对象内部会根据反射来存有对应接口的一堆方法

    • m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });    
            m3 = Class.forName("com.dynamic.test.People").getMethod("sayBye", new Class[] { Class.forName("java.lang.String") });
      
      
  4. 代理对象真正执行方法的时候是调用 InvocationHandler 里的invoke方法

    •   this.h.invoke(this, m4, new Object[] { paramString });
         //this.h 是父类Proxy的InvocationHandler,在步骤2设置了,
         //invoke 则方法是生成代理类时候重写的方法
         //public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
      
  5. 所以其实转了一圈,代理对象最终执行的方法即是newProxyInstance传进去的第三个参数(InvocationHandler),有点策略模式的味道,最终要执行的代理策略是由用户自己决定的策略,将控制权交给了生成代理对象的用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值