ASM

pxbibm發表於2014-04-15

在講 ASM 之前 你需要對 .class位元組碼有一個較為深刻的認識。請參考這兩篇文章

JVM 基礎概念

機器碼 指令 組合語言 的關係

通過第一篇文章,我們知道 .class位元組碼在jvm虛擬機器中就是機器碼。

然後第二篇文章告訴我們 機器碼有對應的指令集和組合語言

那麼我們可以思考一下,.class位元組碼作為jvm虛擬機器中的機器碼,有沒有類似於指令集和組合語言這樣的工具呢?

答案是有,ASM就是這樣的工具

作用

我們知道java這門語言,是不支援在執行時,對一個類進行修改(比如新增一個方法)。

但ASM 可以。

ASM可以動態修改已經編譯過的.class位元組碼。所謂的動態修改指的是在執行時,在記憶體中完成的。

ASM 如何修改一個class 位元組碼

ASM的核心呢主要有三個類

  • ClassReader
  • ClassWriter
  • ClassVisitor

用這三個類就可以解析一個class 位元組碼, 獲得欄位、方法了等資訊,還可以對這些資訊進行修改,最終形成一個代表新class 的位元組碼陣列

一個簡單的ASM例項

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中語言多的都選不多來

相關文章