java源碼經(jīng)過編譯,生成class字節(jié)碼文件,JVM加載class文件執(zhí)行。字節(jié)碼文件將java語言與JVM解耦,除java語言外Groovy、JRuby、Jython、Scala均可生成字節(jié)碼文件,運動到j(luò)ava虛擬機上?,F(xiàn)在了解下字節(jié)碼文件結(jié)構(gòu)。
字節(jié)碼文件數(shù)據(jù)結(jié)構(gòu)
無符號數(shù):u1、u2、u4、u8 來分別代表 1 個字節(jié)、2 個字節(jié)、4 個字節(jié)和 8 個字節(jié)的無符號數(shù)
表:多個無符號數(shù)或者其他表作為數(shù)據(jù)項構(gòu)成的復合數(shù)據(jù)類型,class文件中所有的表都以“_info”結(jié)尾
class文件結(jié)構(gòu)

魔數(shù): 0XCAFEBABE
版本號:前兩個字節(jié)代表次版本號,后兩個字節(jié)主版本號
常量池:存放類各種信息的表,每一項是一個表,常量池內(nèi)部的表中也有相互之間的引用,前兩個字節(jié)為計數(shù)器,后面為各種表。
訪問標志:兩個字節(jié),定義類或者接口,public或者private,abstract或者final等。
類索引、父類索引、接口索引計數(shù)器、接口索引:所謂索引,即常量池中的第幾項,兩個字節(jié),會指向常量池中的類/接口引用表。
字段表:類級別變量以及實例變量,包含字段計數(shù)器以及各個字段表。
方法表:計數(shù)器以及各個方法表
屬性表:無固定格式,典型如Code類型屬性表,為字節(jié)碼指令,字段表及方法表中會有屬性表
編譯插樁
可分為兩類
- APT(Annotation Process Tools) :用于生成 Java 代碼
- AOP(Aspect Oriented Programming):用于操作字節(jié)碼
熟悉了class文件結(jié)構(gòu),就可以通過AOP記性編譯插樁,目前主要有兩種框架:AspectJ、ASM