在講 ASM 之前 你需要對 .class位元組碼有一個較為深刻的認識。請參考這兩篇文章
通過第一篇文章,我們知道 .class位元組碼在jvm虛擬機器中就是機器碼。
然後第二篇文章告訴我們 機器碼有對應的指令集和組合語言
那麼我們可以思考一下,.class位元組碼作為jvm虛擬機器中的機器碼,有沒有類似於指令集和組合語言這樣的工具呢?
答案是有,ASM就是這樣的工具
作用
我們知道java這門語言,是不支援在執行時,對一個類進行修改(比如新增一個方法)。
但ASM 可以。
ASM可以動態修改已經編譯過的.class位元組碼。所謂的動態修改指的是在執行時,在記憶體中完成的。
ASM 如何修改一個class 位元組碼
ASM的核心呢主要有三個類
- ClassReader
- ClassWriter
- ClassVisitor
用這三個類就可以解析一個class 位元組碼, 獲得欄位、方法了等資訊,還可以對這些資訊進行修改,最終形成一個代表新class 的位元組碼陣列
一個簡單的ASM例項
上面的程式碼是什麼意思呢,其實就是 Hello wordpublic 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中語言多的都選不多來