概述
在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图所示:
使用字节码的好处:一处编译,到处运行。java 就是典型的使用字节码作为中间语言,在一个地方编译了源码,拿着.class 文件就可以在各种计算机运行。
字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。常见的字节码操作分为以下几类:
优缺点如下:
字节码工具 | 优点 | 缺点 |
---|---|---|
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处理流程
目标类