格式不好控制,大家在閱讀時(shí)注意縮進(jìn)。
magic[4字節(jié)] 魔數(shù),用來判斷是否可以被虛擬機(jī)使用。固定值為0xCAFEBABE(咖啡寶貝)
minor_version[2字節(jié)] 次版本號(hào)
major_version[2字節(jié)] 主版本號(hào),低版本的jdk無法執(zhí)行高版本的class文件。
constant_pool_count[2字節(jié)] 常量池里的項(xiàng)目個(gè)數(shù)
constant_pool 常量池里每一個(gè)項(xiàng)目類型都用一個(gè)tag標(biāo)示。從1開始取值,比如取值為1時(shí),表示info里存放的是utf8的字符串
????????tag[1字節(jié)] 不同的取值,決定了其下info的結(jié)構(gòu)不同
????????info
access_flags[2字節(jié)] 類的訪問標(biāo)識(shí)位,用來標(biāo)識(shí)類是否具有pulbic/abstract/interface/final等修飾符。用其中的bit位標(biāo)識(shí)是否存在。例如,如果是public的class,其值為0x0001
this_class[2字節(jié)] 兩個(gè)字節(jié)的數(shù)值,指向常量池里的某一個(gè)項(xiàng)目。這里指向的是當(dāng)前類的全名稱
super_class[2字節(jié)] 指向常量池里的當(dāng)前類的父類全名稱
interfaces_count[2字節(jié)] 當(dāng)前類實(shí)現(xiàn)的接口個(gè)數(shù)
interfaces 每一個(gè)指向常量池里的接口的全名稱
fields_count[2字節(jié)] 當(dāng)前類的成員變量個(gè)數(shù)
fields? 成員變量信息
????????access_flags[2字節(jié)] 成員變量的訪問標(biāo)識(shí),與上邊access_flags相似
????????name_index[2字節(jié)] 指向常量池里當(dāng)前字段的名字
????????desc_index[2字節(jié)] 指向常量池里當(dāng)前字段的描述。例如字符串類型對(duì)應(yīng)的描述是'Ljava.lang.String;'
????????attribute_count[4字節(jié)] 字段的屬性表個(gè)數(shù),跟類的屬性表類似。在下面介紹
????????attributes 存放字段的屬性信息
methods_count[2字節(jié)] 當(dāng)前類的成員方法個(gè)數(shù)
mehtods? 成員方法信息
????????access_flags[2字節(jié)] 成員方法的訪問標(biāo)識(shí),與上邊access_flags相似
????????name_index[2字節(jié)] 指向常量池里當(dāng)前方法的名字
????????desc_index[2字節(jié)] 指向常量池里當(dāng)前方法的簽名。比如 public String test(Object o) 方法對(duì)應(yīng)描述是(Ljava.lang.Object;)Ljava.lang.String;
????????attributes_count[4字節(jié)] 方法的屬性表個(gè)數(shù),跟類的屬性表類似。在下面介紹
????????attributes 存放方法的屬性信息,最重要的屬性就是Code,存放了方法的字節(jié)碼指令
attributes_count[2字節(jié)] 類的屬性表個(gè)數(shù)
attributes? 類的屬性信息
attribute_name_index[2字節(jié)]? 指向常量池里屬性的名稱
attribute_length[4字節(jié)]? 下邊info內(nèi)容的長度
info 屬性的內(nèi)容。不同的屬性,內(nèi)容結(jié)構(gòu)不同
以Code屬性表為例,其結(jié)構(gòu)如下:
? ? attribute_name_index[2字節(jié)]? 指向常量池里的Code字符串
? ? attribute_length[4字節(jié)] 該屬性的長度
? ? max_stack[2字節(jié)] 當(dāng)前方法操作數(shù)棧的最大深度
? ? max_locals[2字節(jié)] 存放局部變量所需要的空間個(gè)數(shù)
? ? code_length[4字節(jié)] 源碼編譯后字節(jié)碼指令的長度
? ? code 字節(jié)碼指令
? ? exception_table_length 異常表個(gè)數(shù)
? ? exception_table 異常表
? ? attributes_count 當(dāng)前屬性下的屬性個(gè)數(shù)
????attributes
從上邊的結(jié)構(gòu)我們不難看出,其實(shí)Java class文件的各是還是比較簡潔的。其中的attributes可以根據(jù)需要隨時(shí)添加,用來滿足Jvm后期發(fā)展的需求。