Java ClassFile格式詳解

格式不好控制,大家在閱讀時(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ā)展的需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容