ASM是非常強大的JAVA字節(jié)碼生成和修改工具,具有性能優(yōu)異、文檔齊全、比較易用等優(yōu)點。官方網(wǎng)站:http://asm.ow2.org/
要想熟練的使用ASM,需要對java字節(jié)碼有一定的了解,本文重點對java函數(shù)的字節(jié)碼進行介紹。本文部分內(nèi)容參考官方文檔:http://download.forge.objectweb.org/asm/asm4-guide.pdf
1.JAVA虛擬機執(zhí)行模型
在JVM執(zhí)行模型里,每個方法都是在線程中執(zhí)行,而每個線程對應(yīng)自己的棧,每個棧由幀組成。每個幀對應(yīng)一個方法調(diào)用,每次調(diào)用一個方法,
會將新幀壓入當前線程的執(zhí)行棧,當方法返回時(異常退出也是返回),再將這個幀從執(zhí)行棧彈出。
每個幀主要包括兩部分,一個局部變量表和一個操作數(shù)棧,關(guān)系如下圖所示:
這里注意,局部變量表是根據(jù)索引訪問的列表,類似數(shù)組;而操作數(shù)棧則是“后入先出”的棧,這里非常重要,因為java函數(shù)的字節(jié)碼指令基本上都是對這兩個數(shù)據(jù)結(jié)構(gòu)進行操作。
局部變量表和操作數(shù)棧的大小取決于方法代碼,在編譯時計算,并隨字節(jié)碼指令一起寫入class文件