ASM

1,293 阅读2分钟

在讲 ASM 之前 你需要对 .class字节码有一个较为深刻的认识。请参考这两篇文章

JVM 基础概念

机器码 指令 汇编语言 的关系

通过第一篇文章,我们知道 .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中语言多的都选不多来