探祕Java字節碼文件

類文件結構

實現語言無關性的基礎仍然爲虛擬機字節碼存儲格式,Java虛擬機不和包括Java在內的任何語言綁定,它只與“Class文件”這種特定的二進制文件格式所關聯。

Class文件的結構

Class文件是一組以8位字節爲基礎單位的二進制流,各個項目嚴格按照順序排列,其中沒有分隔符。
任何一個Class文件都對應着唯一一個類或接口的定義信息。Class文件中只有兩種數據類型:無符號數和表。無符號數中以u1,u2,u4,u8分別代表1個字節、2個字節、4個字節和無符號數。表是由多個無符號數或其他表作爲數據項構成的複合數據類型,所有的表都習慣性的以“_info”結尾。
Class文件的整體框架見下圖所示。
在這裏插入圖片描述
無論是無符號數還是表,當需要描述同一類型但數量補丁的多個數據時,要使用到前置容量計數器+若干個連續的數據項的形式。

魔數與Class文件的版本

每個Class文件頭4個字節都被稱爲魔數,它的唯一作用是確定這個文件是否爲一個能被虛擬機接受的Class文件。Class文件的魔數0xCAFEBABE
版本號:minor_version代表小版本,major_version代表大版本

常量池:

常量池可以理解爲Class文件之中的資源倉庫。常量池中主要存放兩大類常量:字面量(Literal)和符號引用(Symbolic References)。
字面量即Java語言層面的常量,如文本字符串、聲明爲final的常量值;符號引用屬於編譯原理方面的概念,包括下面三類常量:
* 類和接口的全限定名
* 字段(成員變量)的名稱和描述符
* 方法的名稱和描述符
由於常量池中的常量的數量是不固定的,所以需要一個名爲constant_pool_count的u2類型的數據表示常量池中常量的個數。
常量池中每一項常量都是一個表,每一種常量類型對應着一種表結構,常量池中所有的常量類型如下圖所示
在這裏插入圖片描述
CONSTANT_Class_info爲例,介紹這一常量的結構
在這裏插入圖片描述
第一項tag即表示該表屬於哪種常量的表結構,第二項name_index指向了一個CONSTANT_Utf8_info的常量(以_index)結尾的都是一個類似指針的變量,指向一個地址
常量池中14種常量項的結構總表見下圖
在這裏插入圖片描述
在這裏插入圖片描述

訪問標誌

常量池之後,緊跟着兩個字節代表訪問標誌access_flags,這個標誌用於識別類或接口層次的訪問信息,包括:這個Class是類還是接口,是否定義爲public類型;是否定義爲abstract類型,如果是類的話,是否被聲明爲final等。

類索引、父類索引與接口索引集合

this_class和super_class都是一個u2類型的數據,而interfaces是一組u2類型的數據集合(需要interfaces_count指明接口數量)。
類索引、父類索引和接口索引都向常量池中的類的全限定名常量。類索引查找全限定名的過程如下圖所示
在這裏插入圖片描述

字段表集合

字段表用於描述接口或者類中聲明的變量,但不包括方法內部聲明的局部變量,也不會列出從超類或父類接口中繼承而來的字段。
每個字段表都需要從這些方面對字段進行描述:訪問標誌(access_flags),簡單名稱索引(name_index),描述符(descriptor_index),如下圖
在這裏插入圖片描述

  • access_flags用來描述該字段的作用域(public, private, protected)、是否爲靜態變量(static)、可變性(final)、併發可見性(volatile)……
  • 簡單名稱是指沒有類型和參數修飾的方法或字段名稱
  • 描述符:對於變量而言是數據類型,例如java.lang.String[][]的描述符爲[[Ljava/lang/String;對於方法而言是參數列表+返回值,例如void inc()的描述符爲()V
  • 屬性:如果這個變量有初值,則需要用一個屬性表的數據結構去描述,關於屬性表會在後面詳細介紹

方法表集合

用於描述方法,與字段表集合類似。方法裏的Java代碼,經過編譯器編譯成字節碼指令後,存放在“Code”屬性表中。

屬性表集合

屬性表可以出現在Class文件、字段表、方發表中,這裏只介紹Code屬性,該屬性出現在方法表中,其結構如下圖
在這裏插入圖片描述
Java程序中的信息可以分爲代碼(Code,方法體裏面的Java代碼)和元數據(Metadata,包括類、字段、方法定義以及其他信息),其中,Code屬性用於描述代碼,所有其他數據項目用於描述元數據。

(本文總結於《深入理解Java虛擬機》)

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