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