在講 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中語言多的都選很少來