Java对类魔法加工的一些技术
2020-09-24 本文已影响0人
嘻嘻是小猪
-
运行时注解
在运行时拿到类的Class对象,反射机制利用之 -
编译时注解
生成的Java代码是在生成的.java文件中,所以你不能修改已经存在的Java类,例如向已有的类中添加方法。这 些生成的Java文件,会同其他普通的手动编写的Java源代码一样被javac编译。因为没有反射,效率和直接调用方法没什么区别。ParcelableGenerator、butterknife 、androidannotaion都使用了类似技术。
涉及到Annotation Processor
java 编译时注解处理
Java 《注解篇》 编译时注解 -
JDK动态代理
为已有类方法增加新功能,本质是利用字节码操纵技术,生成新的与原生类有相同接口
的com.sun.proxy.$ProxyXXXX.class。并在Proxy.newProxyInstance方法中,会先load这个代理class, 然后通过反射构造代理类的实例 -
Cglib动态代理
也是为类方法增进新功能,也是通过字节码操纵,和JDK动态代理区别在于,新生类不用和原类实现同一接口。cglib主要靠的是继承关系
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) -
JVM启动前静态Instrument
main函数执行前,对正在加载中的类修改其字节码,涉及javaagent/java.lang.instrument.ClassFileTransformer/字节码操纵技术等 -
JVM启动后动态Instrument
main 函数开始运行之后,对正在加载的类修改其字节码,涉及javaagent/java.lang.instrument.ClassFileTransformer/字节码操纵技术等