ASM

在講 ASM 以前 你須要對 .class字節碼有一個較爲深入的認識。請參考這兩篇文章java

JVM 基礎概念數組

機器碼 指令 彙編語言 的關係bash

經過第一篇文章,咱們知道 .class字節碼在jvm虛擬機中就是機器碼。jvm

而後第二篇文章告訴咱們 機器碼有對應的指令集和彙編語言工具

那麼咱們能夠思考一下,.class字節碼做爲jvm虛擬機中的機器碼,有沒有相似於指令集和彙編語言這樣的工具呢?post

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

做用

咱們知道java這門語言,是不支持在運行時,對一個類進行修改(好比新增一個方法)。hibernate

但ASM 能夠。3d

ASM能夠動態修改已經編譯過的.class字節碼。所謂的動態修改指的是在運行時,在內存中完成的。code

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

相關文章
相關標籤/搜索