閱讀《深入理解Java虛擬機》第2版,結合JDK8的讀書筆記。當前文章爲書本的第6章節。
6.1.概述
越來越多的程序語言選擇了與操作系統和機器指令集無關的、平臺中立的格式作爲程序編譯後的存儲格式。
6.2.無關性的基石
- 平臺無關性
各種不同平臺的虛擬機與所有平臺都統一使用的程序存儲格式-字節碼(ByteCode),是構成平臺無關性的基石.
- 語言無關性
實現語言無關性的基礎是虛擬機和字節碼存儲格式。Java虛擬機不和包括Java在內的任何語言綁定,它只與“Class文件”這種特定的二進制文件格式所關聯。
6.3.Class類文件的結構
Class文件是一組以8位字節爲基礎單位的二進制流,各個數據項目嚴格按照順序緊湊地排列在Class文件之中,中間沒有添加任何分隔符。根據java虛擬機規範的規定,Class文件格式採用一種類似於C語言結構體的僞結構來存儲數據,這種僞結構中只有無符號數和表。
- 無符號數屬於基本的數據類型,以u1,u2,u4,u8來代表1個字節,2個字節,4個字節和8個字節。
無符號數可以用來描述數字、索引引用、數量值或者按照UTF-8編碼構成字符串值。
- 表是由多個無符號數或者其他表作爲數據項構成的複合數據類型,所以表都習慣性地以“_info”結尾。
表用於描述有層次關係的複合結構的數據,整個Class文件本質上就是一張表。由以下表格所示的數據項構成。
類型 | 名稱 | 數量 | 備註 |
---|---|---|---|
u4 | magic | 1 | 魔數值;Java文件爲CAFEBABE |
u2 | minor_version | 1 | 此版本 |
u2 | major_version | 1 | 主版本;十進制45表示JDK1.1 |
u2 | constant_pool_count | 1 | 常量數 |
cp_info | constant_pool | constant_pool_count-1 | 常量池 |
u2 | access_flags | 1 | 訪問標識 |
u2 | this_class | 1 | 當前類索引值 |
u2 | super_class | 1 | 當前類的父類索引值,Java單繼承 |
u2 | interfaces_count | 1 | 當前類的接口數量值,Java多實現 |
u2 | interfaces | interfaces_count | 當前類的接口索引值 |
u2 | fields_count | 1 | 字段數量 |
field_info | fields | fields_count | 字段信息表 |
u2 | methods_count | 1 | 方法數量 |
method_info | methods | methods_count | 方法信息表 |
u2 | attributes_count | 1 | 屬性數量 |
attribute_info | attributes | attributes_count | 屬性信息表 |
6.3.1.魔數與Class文件的版本
- magic - u4
魔數(Magic-Number),用於確定該文件是否爲一個能被虛擬機接受的class文件
很多文件存儲標準中都用魔數來進行身份識別,如gif,jpeg都在文件頭中存有魔數。JAVA的class文件魔數爲CAFEBABE。
- minior_version - u2
次版本號
- major_version - u2
主版本號。
Java版本號從45開始。0x002D等同於十進制2*16+13=45,也就是JDK1
未完待續…