Java动态代理技术方案:JDK、CGLib、Javassist、ASM

文章目录

  • JDK
  • CGLib
  • Javassist
  • ASM


JDK

JDK提供了sun.misc.ProxyGenerator.generateProxyClass(String proxyName,class[] interfaces) 底层方法来产生动态代理类的字节码。

JDK提供的生成动态代理类的机制有个鲜明的特点是: 某个类必须有实现的接口,而生成的代理类也只能代理某个类接口定义的方法。
如果类除了实现接口的方法外,还有另外其它方法,则在产生的动态代理类中不会有这个方法了;更极端的情况下,如果某个类没有实现接口,那么这个类就不能同JDK产生动态代理了。

JDK动态代理创建机制:通过接口。

JDK动态代理流程:

  1. 获取需代理的类实现的所有接口列表;
  2. 确定要生成的代理类的类名,默认为:com.sun.proxy.$ProxyXXXX;
  3. 根据需要实现的接口信息,在代码中动态创建该Proxy类的字节码;
  4. 将对应的字节码转换为对应的class对象;
  5. 创建InvocationHandler实例handler,用来处理Proxy所有方法调用;
  6. Proxy的class对象以创建的handler对象为参数,实例化一个proxy对象。

JDK生成的动态代理类有以下特点:

  • 继承自 java.lang.reflect.Proxy,实现需要实现代理的类上的所有接口
  • 类中的所有方法都是final的;
  • 所有的方法功能的实现都统一调用了InvocationHandler的invoke()方法。

CGLib

CGLib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。

CGLib生成动态代理类的机制:通过类继承。

CGLib动态代理类的模式是:

  1. 查找A上的所有非final 的public类型的方法定义;
  2. 将这些方法的定义转换成字节码;
  3. 将组成的字节码转换成相应的代理的class对象;
  4. 实现 MethodInterceptor接口,用来处理 对代理类上所有方法的请求(这个接口和JDK动态代理InvocationHandler的功能和角色是一样的)

Javassist

Javassist是一个开源的分析、编辑和创建Java字节码的类库。是一种字节码增强技术。

Javassist加入了开放源代码JBoss应用服务器项目,是Jboss的一个子项目。通过使用Javassist对字节码操作为JBoss实现动态AOP框架。其主要的优点,在于简单,而且快速。

Javassist直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

ASM

ASM 是一个Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM可以直接产生二进制class文件,也可以在类被加载入Java虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。

ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。



参考文章:

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

JDK 和CGLIB、Javassist、ASM之间的差别

你可能感兴趣的:(Java,java)