《深入理解Java虛擬機》之類文件結構

閱讀《深入理解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

未完待續…

關注我

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