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

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

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

原理分析

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

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

  主要过程:

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

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

主要原理调用结构

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

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

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

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

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

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