字节码增强技术-ASM

概述

在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图所示:

WX20230814-215953@2x.png

使用字节码的好处:一处编译,到处运行。java 就是典型的使用字节码作为中间语言,在一个地方编译了源码,拿着.class 文件就可以在各种计算机运行。

字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。常见的字节码操作分为以下几类:

aop (1).png

优缺点如下:

字节码工具 优点 缺点
Java-proxy - 简单易用
- 原生支持
- 仅能代理接口或继承类
- 动态代理类需实现接口
ASM - 强大的字节码操作能力
- 高性能
- 学习曲线较陡
- 代码较复杂
AspectJ - 强大的 AOP 支持
- 高度集成
- 学习曲线较陡
- 需要特定编译器或处理器
JavaAssist - 提供高级别的 API
- 简化字节码操作
- 相对较简单
- 性能相对较低
CGLib - 可代理普通类
- 高性能
- 无法代理 final 类
- 生成代理类较大
ByteBuddy - 简洁的 API
- 高性能
- 功能全面
- 支持运行时生成和修改类
- 学习成本较高

ASM介绍

ASM是一种通用Java字节码操作和分析框架。它可以用于修改现有的class文件或动态生成class文件。

ASM is an all purpose Java bytecode manipulation and analysis framework. It can be used to modify existing classes or to dynamically generate classes, directly in binary form. ASM provides some common bytecode transformations and analysis algorithms from which custom complex transformations and code analysis tools can be built. ASM offers similar functionality as other Java bytecode frameworks, but is focused onperformance. Because it was designed and implemented to be as small and as fast as possible, it is well suited for use in dynamic systems (but can of course be used in a static way too, e.g. in compilers).

ASM的应用场景有AOP(Cglib就是基于ASM)、热部署、修改其他jar包中的类等。当然,涉及到如此底层的步骤,实现起来也比较麻烦。下面我们看一下ASM是如何编辑class字节码的。

ASM处理流程

目标类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值