在讲 ASM 以前 你须要对 .class字节码有一个较为深入的认识。请参考这两篇文章java
JVM 基础概念数组
机器码 指令 汇编语言 的关系bash
经过第一篇文章,咱们知道 .class字节码在jvm虚拟机中就是机器码。jvm
而后第二篇文章告诉咱们 机器码有对应的指令集和汇编语言工具
那么咱们能够思考一下,.class字节码做为jvm虚拟机中的机器码,有没有相似于指令集和汇编语言这样的工具呢?post
答案是有,ASM就是这样的工具spa
咱们知道java这门语言,是不支持在运行时,对一个类进行修改(好比新增一个方法)。hibernate
但ASM 能够。3d
ASM能够动态修改已经编译过的.class字节码。所谓的动态修改指的是在运行时,在内存中完成的。code
ASM的核心呢主要有三个类
用这三个类就能够解析一个class 字节码, 得到字段、方法了等信息,还能够对这些信息进行修改,最终造成一个表明新class 的字节码数组
public static void main(String[] args) {
System.out.println("Hello word!");
}
复制代码
因为ASM 在JVM虚拟机中至关因而 指令集和汇编语言同样的存在,所以它十分强大,应用范围也很广。
常常使用的Spring , hibernate 的最核心的功能就用到了 ASM。
没有ASM, Jython、JRuby 根本就移植不到jvm虚拟机中
没有ASM, Clojure, Groovy这些语言也无法在jvm虚拟机中运行
ASM的做者在为该工具取名的时候,也是煞费苦心,后来它想到了 C语言中 _asm_
这个关键字,能够运行在C语言中写点汇编,做者以为很不错,就取名为ASM
ASM 对 jvm虚拟机的生态作出的重大贡献,原来JVM中只有Java一门语言,如今JVM中语言多的都选很少来