Java字节码增强

Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。Java字节码增强的应用场景主要是减少冗余代码,对开发人员屏蔽底层的实现细节。
字节码增强技术主要有两种实现机制:一种是通过创建原始类的一个子类;另一种是很暴力的方式,直接去修改原先的class字节码。
实现字节码增强需要通过如下两个步骤:
(1)在内存中获取到原始的字节码,然后通过一些其他API(ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组。
(2)将这个新的byte数组写到PermGen区域,也就是加载它或替换原来的Class字节码(字节码增强还可以在进程外调用完成)
下面是一个例子:在某些方法执行前,输出点内容。
①被增强的类
Java字节码增强

②使用ASM进行字节码增强
Java字节码增强
其实这里理解起来并不困难,就是在写虚指令
③现在,通过这段代码就可以得到一个修改方法后的类的字节码信息,但是还需要进一步写到Perm Generation中,写入后就称为一个正在的class类了。
Java字节码增强
④测试
Java字节码增强
输出结果如下:
Java字节码增强
整个就完成了字节码增强。
ASM是一种修改字节码本身的API,它实现的抽象层次是很低的,几乎接近于指令级别的。虽然简化了操作二进制的麻烦,但是需要记住200多个指令,这样会比较麻烦的。而是用javassist的话就简单多了,如下所示:
Java字节码增强
就这么简单的方式字节码就被增强了,调用程序得到返回的byte[]后,就可以向上面中通过ClassLoader来加载类了,需要注意的是javassist对同一个类只能重新定义一次,它会记录这个类已经被更改了,再次字节码增强时,会报这个错误:class is frozen and pruned。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值