zoukankan      html  css  js  c++  java
  • 《Proxy系列专题》:JDK动态代理源码解析

    《Proxy系列专题》:JDK动态代理源码解析

      其实说简单也简单,说复杂也很复杂,认真带着问题去看会不错的体会。

      JDK动态代理的原理总结一句话:利用接口的的意义,是表达了此类型的功能大全,再利用字节码拼装技术,复制一份表皮,确定想要调用那个方法,在代理类中转反射调用目标对象的方法

    原理分析

      首先看一下我根据源码画出的一幅时序图,跟市面的很像,哈哈

      

      主要过程:

    1. 首先获取到目标类的加载器和所有接口信息。
    2. 通过getProxyClass0生成代理类class文件(若目标接口的类加载器的代理类存在,则返回缓存;否则,通过ProxyClassFactory创建代理),涉及类名、方法、类基本信息的拼装,实现目标类实现的所有接口。
    3. 在defineClass0中,本地navtive将字节码加载到内存中getContructor选择指定公共构造器来newInstance创建代理类对象

    4. 在代理类中调用InvocationHandler处理,反射调用目标类的方法。

    主要原理调用结构

    JDK动态代理为什么只能用接口

    1、首先JDK动态代理是利用反射的原理实现的动态代理行为

    2、然而反射invoke方法的参数是目标类实例和参数

    3、所以在字节码的拼装的时候,只需要根据接口功能做出重写,这样就知道有什么功能,不需要知道什么逻辑

    4、因为反射invoke传入的参数是目标类实例,所以只要知道那个方法就足够了,再利用InvocationHandler来利用反射原理调用目标类方法逻辑

    坚定信念,持之以恒
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CSS Grid网格布局全攻略
    正则表达式不要背
    前端模块化的前世今生
    关于React Hooks,你不得不知的事
    精简版LINUX系统---wdOS
    TypeScript_泛型
    typescript_类
    ES5_对象 与 继承
    TypeScript_基础数据类型
    vue-route+webpack部署单页路由项目,访问刷新出现404问题
  • 原文地址:https://www.cnblogs.com/zhouguanglin/p/14390107.html
Copyright © 2011-2022 走看看