字节码技术
1,Lombok 插件,类里面可以免去写getters,setters方法,加上注解@Getter @Setter 里面就是用字节码技术动态生成属性的getters,setters 方法
1,IDE 安装lombok 插件
2,项目maven 引用包
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency>
https://blog.csdn.net/yiyijianxian/article/details/80156910 安装过程可以参考
import lombok.Getter; import lombok.Setter; @Getter @Setter public class User { private String name; private String age; public static void main(String[] args) { new User().getName(); } }
2,Aop 面向切面编程,动态代理的实现,也是用了字节码技术,动态生成代理类
3,字节码技术优点
Java字节码增强主要是为了减少冗余代码,提高性能等。
实现字节码增强的主要步骤为:
1、修改字节码
在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组。
2、使修改后的字节码生效
有两种方法:
1) 自定义ClassLoader来加载修改后的字节码;
2)替换掉原来的字节码:在JVM加载用户的Class时,拦截,返回修改后的字节码;或者在运行时,使用Instrumentation.redefineClasses方法来替换掉原来的字节码
4,常见的字节码类库
BCEL:
Byte Code Engineering Library(BCEL),这是Apache Software Foundation的Jakarta项目的一部分。BCEL是Java classworking 广泛使用的一种框架,它可以让您深入jvm汇编语言进行类库操作的细节。BCEL与javassist有不同的处理字节码方法,BCEL在实际的jvm指令层次上进行操作(BCEL拥有丰富的jvm指令集支持) 而javassist所强调的是源代码级别的工作。
ASM:
是一个轻量级Java字节码操作框架,直接涉及到JVM底层的操作和指令
高性能,高质量
CGLB:
生成类库,基于ASM实现
javassist:
是一个开源的分析,编辑和创建Java字节码的类库。性能较ASM差,跟cglib差不多,但是使用简单。很多开源框架都在使用它。