1.代理简介
2.静态代理
3.动态代理
3.1.jdk
使用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理,JDK创建代理对象效率较高,但是执行效率较低
使用流程:实现InvocationHandler接口,重写invoke(),使用Proxy.newProxyInstance()产生代理对象,被代理的对象必须要实现接口
3.2.cglib
CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类,因为是继承的关系,所以不能代理final修饰的类,CGLIB创建代理对象效率较低,执行效率高,CGLib必须依赖于CGLib的类库
使用流程:实现MethodInterceptor接口,重写intercept(),使用Enhancer对象.create()产生代理对象
Jdk动态代理的拦截对象是通过反射的机制来调用被拦截方法的,反射的效率比较低,所以cglib采用了FastClass的机制来实现对被拦截方法的调用。FastClass机制就是对一个类的方法建立索引,通过索引来直接调用相应的方法
Fastclass机制描述下,equals()方法、hashcode()方法、getClass()方法不能被代理
3.3.javaassistant
Javassit其实就是一个二方包,是使用Java编码方式创建新类或者修改现有类。在性能上Javassist高于反射但低于ASM,因为Javassist增加了一层抽象
3.4.asm
ASM是一个Java字节码操控框架,它可以直接产生二进制class文件,也可以在类被加载入Java虚拟机之前动态改变类行为(也就是生成的代码可以覆盖原来的类也可以是原始类的子类)。不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解
3.5.总结
从Java动态代理实现上来看,可分为两种策略:一种是操作字节码创建新类或者修改现有类,比如ASM/byte-buddy/Java动态代理;另一种是使用Java编码方式创建新类或者修改现有类,比如javassist
关于动态代理的性能问题,如果是生成的class是被代理类的子类或者(添加了代理逻辑的)被代理类本身,理论上性能和直接调用被代理类逻辑是一样的;如果生成的class是通过反射等方式进行调用被代理类逻辑的,那么性能上相对来说是比较弱的
标签:调用,Java,字节,基础,代理,java,class,ASM From: https://www.cnblogs.com/zz-coding/p/17300109.html