深入Java虛擬機一:類文件結構

這個系列的博客大多是閱讀《深入理解Java虛擬機》後整理而來,是本好書值得讀好多遍。

0x00 寫在前面:

1.先引用一下書中的話:

Class文件各個數據項目嚴格按照順序緊湊地排列着,中間沒有添加任何分隔符

因爲Class文件要保持經湊,在一些不定長的數據結構中就經常會出現如下結構

數據長度length 數據data

其中length表示了緊隨其後的data所佔字節數。

2.constant_pool是一個挺重要的結構了,因爲好多其他部分都引用了資源池中的數據。另外一個重要的結構attribute_info在後面一節畫上吧

0x01 整體結構

我按照Class文件的結構順序的畫了下思維導圖如下(即圖中從上到下的順序也就是class文件內部結構的順序),該說的東西也都在裏面了:
在這裏插入圖片描述

0x02屬性

屬性表(attributes)由0或多個attribute_info組成,在字段表、方法表、class中均可能會存在attribute_info信息。整體歸納總結如下圖,圖中的也只是一部分屬性,(圖中各項屬性只是列舉的關係):
在這裏插入圖片描述
注:

  1. Code屬性中的code_lengths和code是用來存儲Java源程序編譯後生成的字節碼指令,其中code保存的是字節碼指令和指令所需要的參數,每個字節碼指令大小固定佔1字節,其參數根據不同指令佔用不同的大小空間,一條指令所需參數佔用空間大小是固定的。(1字節可以表示256條指令,目前Java已經定義了200多條指令)比如invokespecial = 183 (0xb7)指令,他需要兩個字節的參數,緊隨其後。具體格式可以參考官方文檔
  2. ConstantValue屬性是字段表中的一個屬性,因此該屬性中只保存了一個Constantvalue_index(Constantvalue_index是指向常量池中一個字面常量的引用,就是對應字段的值)

參考:https://blog.csdn.net/wzq6578702/article/details/81415905

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章