Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。Java字节码增强的应用场景主要是减少冗余代码,对开发人员屏蔽底层的实现细节。
字节码增强技术主要有两种实现机制:一种是通过创建原始类的一个子类;另一种是很暴力的方式,直接去修改原先的class字节码。
实现字节码增强需要通过如下两个步骤:
(1)在内存中获取到原始的字节码,然后通过一些其他API(ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组。
(2)将这个新的byte数组写到PermGen区域,也就是加载它或替换原来的Class字节码(字节码增强还可以在进程外调用完成)
下面是一个例子:在某些方法执行前,输出点内容。
①被增强的类
②使用ASM进行字节码增强
③现在,通过这段代码就可以得到一个修改方法后的类的字节码信息,但是还需要进一步写到Perm Generation中,写入后就称为一个正在的class类了。
ASM是一种修改字节码本身的API,它实现的抽象层次是很低的,几乎接近于指令级别的。虽然简化了操作二进制的麻烦,但是需要记住200多个指令,这样会比较麻烦的。而是用javassist的话就简单多了,如下所示: