Java基礎知識之Class結構

每一個Class文件都對應着唯一一個類或接口的定義信息,但是相對地,類或接口並不一定都得定義在文件裏(譬如類或接口也可以通過類加載器直接生成)。

每個Class文件都是由8字節爲單位的字節流組成,所有的16位、32位和64位長度的數據將被構造成 2個、4個和8個8字節單位來表示。

多字節數據項總是按照Big-Endian的順序進行存儲。

在Java SDK中,訪問這種格式的數據可以使用java.io.DataInput、java.io.DataOutput等接口和java.io.DataInputStream 和java.io.DataOutputStream等類來實現。

在Java SDK中這些類型的數據可以通過實現接口java.io.DataInput 中的readUnsignedByte、readUnsignedShort和readInt方法進行讀取。

u1,u2,u4分別代表了1,2,4個字節的無符號書。

1 ClassFile文件

每一個ClassFile都對應着一個結構體

ClassFile 
{ 
u4 magic; 
u2 minor_version; 
u2 major_version; 
u2 constant_pool_count; 
cp_info constant_pool[constant_pool_count-1]; 
u2 access_flags; 
u2 this_class; 
u2 super_class; 
u2 interfaces_count; 
u2 interfaces[interfaces_count]; 
u2 fields_count; field_info fields[fields_count];
u2 methods_count; method_info methods[methods_count];
u2 attributes_count; 
attribute_info attributes[attributes_count]; 
}

 

magic:確定這個是否被虛擬機所接受的Class文件。魔數值固定爲0xCAFEBABE,不會改變。

minor_version,major_version:表示Class文件的副、主版本。

constant_pool_count:常量池計數器,constant_pool_count的值等於constant_pool表中的成員數加1。constant_pool表的索引值只有在大於0且小於constant_pool_count時纔會  被認爲是有效的②。

constant_pool:常量池主要存放兩大類常量:字面量和符號引用。常量池,constant_pool是一種表結構(§4.4),它包含Class文件結構及其子結構中引用的所有字符串常量、類或接口名、字段名和其它常量。常量池中的每一項都具備相同的格式特徵——第一個字節作爲類型標記用於識別該項是哪種類型的常量,稱爲“tag byte”。常量池的索引範圍是1至constant_pool_count−1。

符號引用:類和接口的全限定名,字段的名稱和描述符,方法的名稱和描述符。

access_flags:訪問標誌,是一種掩碼,用來表示一種類或者接口的訪問權限和基礎屬性。

this_class:類索引,this_class的值必須是對constant_pool表中項目的一個有效索引值。constant_pool表在這個索引處的項必須爲CONSTANT_Class_info類型常量。

super_class:父類索引,對於類來說,super_class的值必須爲0或者是對constant_pool表中項目的一個有效索引值。

interfaces_count 接口計數器,interfaces_count的值表示當前類或接口的直接父接口數量。

fields_count:字段計數器,fields_count的值表示當前Class文件fields[]數組的成員個數。fields[]數組中每一項都是一個field_info結構(§4.5)的數據項,它用於表示該類或接口聲明的類字段或者實例字段

fields[]: 字段表,fields[]數組中的每個成員都必須是一個fields_info結構(§4.5)的數據項,用於表示當前類或接口中某個字段的完整描述。fields[]數組描述當前類或接口聲明的所有字段,但不包括從父類或父接口繼承的部分。

methods_count :方法計數器,methods_count的值表示當前Class文件methods[]數組的成員個數。Methods[]數組中每一項都是一個method_info結構(§4.5)的數據項

methods[]:方法表,methods[]數組中的每個成員都必須是一個method_info結構(§4.6)的數據項,用於表示當前類或接口中某個方法的完整描述。

attributes_count 屬性計數器,attributes_count的值表示當前Class文件attributes表的成員個數。

attributes[] 屬性表,attributes表的每個項的值必須是attribute_info結構(§4.7)。在本規範裏,Class文件結構中的attributes表的項包括下列定義的屬性:

 

 

 

 

 

 


 


 

 

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