在讲 ASM 之前 你需要对 .class字节码有一个较为深刻的认识。请参考这两篇文章
通过第一篇文章,我们知道 .class字节码在jvm虚拟机中就是机器码。
然后第二篇文章告诉我们 机器码有对应的指令集和汇编语言
那么我们可以思考一下,.class字节码作为jvm虚拟机中的机器码,有没有类似于指令集和汇编语言这样的工具呢?
答案是有,ASM就是这样的工具
作用
我们知道java这门语言,是不支持在运行时,对一个类进行修改(比如新增一个方法)。
但ASM 可以。
ASM可以动态修改已经编译过的.class字节码。所谓的动态修改指的是在运行时,在内存中完成的。
ASM 如何修改一个class 字节码
ASM的核心呢主要有三个类
- ClassReader
- ClassWriter
- ClassVisitor
用这三个类就可以解析一个class 字节码, 获得字段、方法了等信息,还可以对这些信息进行修改,最终形成一个代表新class 的字节码数组
一个简单的ASM实例
上面的代码是什么意思呢,其实就是 Hello word
public static void main(String[] args) {
System.out.println("Hello word!");
}
ASM的应用
由于ASM 在JVM虚拟机中相当于是 指令集和汇编语言一样的存在,因此它十分强大,应用范围也很广。
经常使用的Spring , hibernate 的最核心的功能就用到了 ASM。
没有ASM, Jython、JRuby 根本就移植不到jvm虚拟机中
没有ASM, Clojure, Groovy这些语言也没法在jvm虚拟机中运行
ASM 名字的由来
ASM的作者在为该工具取名的时候,也是煞费苦心,后来它想到了 C语言中 _asm_ 这个关键字,可以运行在C语言中写点汇编,作者觉得很不错,就取名为ASM
尾巴
ASM 对 jvm虚拟机的生态做出的重大贡献,原来JVM中只有Java一门语言,现在JVM中语言多的都选不多来