【深入Java虛擬機器】之二:Class類檔案結構

來源:互聯網
上載者:User

 

 

無符號數屬於基礎資料型別 (Elementary Data Type),以u1、u2、u4、u8來分別代表1、2、4、8個位元組的無符號數。表是由多個無符號數或其他表作為資料項目構成的符合資料類型,所有的表都習慣性地以“_info”結尾。

(),它的唯一作用是判斷該檔案是否為一個能被虛擬機器接受的Class檔案。它的值固定為0xCAFEBABE。緊接著magic的4個位元組儲存的是Class檔案的次版本號碼和主要版本號,高版本的JDK能向下相容低版本的Class檔案,但不能運行更高版本的Class檔案。

()的入口,它是Class檔案中與其他項目關聯最多的資料類型,也是佔用Class檔案空間最大的資料項目之一。

字面量比較接近於Java層面的常量概念,如文本字串、被聲明為final的常量值等。而符號引用總結起來則包括了下面三類常量:

  • :符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能無歧義地定位到目標即可。符號引用與虛擬機器實現的記憶體布局無關,引用的目標並不一定已經載入到了記憶體中。
  • :直接引用可以是直接指向目標的指標、相對位移量或是一個能間接定位到目標的控制代碼。直接引用是與虛擬機器實現的記憶體布局相關的,同一個符號引用在不同虛擬機器執行個體上翻譯出來的直接引用一般不會相同。如果有了直接引用,那說明引用的目標必定已經存在於記憶體之中了。

 

CONSTANT_Utf8_info

值為

length

u2

UF-8

bytes

u1

長度為

 

CONSTANT_Integer_info

tag

u1

值為

bytes

u4

按照高位在前儲存的

 

CONSTANT_Float_info

tag

u1

值為

bytes

u4

按照高位在前儲存的

 

CONSTANT_Long_info

tag

u1

值為

bytes

u8

按照高位在前儲存的

 

CONSTANT_Double_info

tag

u1

值為

bytes

u8

按照高位在前儲存的

 

CONSTANT_Class_info

tag

u1

值為

index

u2

指向全限定名常量項的索引

 

CONSTANT_String_info

tag

u1

值為

index

u2

指向字串字面量的索引

 

CONSTANT_Fieldref_info

tag

u1

值為

index

u2

指向聲明欄位的類或介面描述符

index

u2

指向欄位名稱及類型描述元

 

CONSTANT_Methodref_info

tag

u1

值為

index

u2

指向聲明方法的類描述符

index

u2

指向方法名稱及類型描述元

 

CONSTANT_InrerfaceMethodref_info

tag

u1

值為

index

u2

指向聲明方法的介面描述符

index

u2

指向方法名稱及類型描述元

 

CONSTANT_NameAndType_info

tag

u1

值為

index

u2

指向欄位或方法名稱常量項目的索引

index

u2

指向該欄位或方法描述符常量項的索引

    在常量池結束之後,緊接著的2個位元組代表訪問標誌(access_flag),這個標誌用於識別一些類或介面層次的訪問資訊,包括:這個Class是類還是介面,是否定義為public類型,abstract類型,如果是類的話,是否聲明為final,等等。每種訪問資訊都由一個十六進位的標誌值表示,如果同時具有多種訪問資訊,則得到的標誌值為這幾種訪問資訊的標誌值的邏輯或。

this_class、super_class、interfaces

下面是欄位表的最種格式:

int m = 2;那就可能會存在一項名為ConstantValue的屬性,它指向常量2。關於attribute_info的詳細內容,在後面關於屬性工作表的項目中會有詳細介紹。

比如在內部類中為了保持對外部類的訪問性,會自動添加指向外部類執行個體的欄位。

如果方法表有Code屬性存在,那麼它的結構將如下表所示:

)出現了類型為catch_type或其子類的異常(catch_type為指向一個CONSTANT_Class_info型常量的索引這篇文章中出現的情況。

),如果該變數沒有被final修飾,或者並非基本類型及字串,則選擇在<clinit>方法中進行初始化。

而且ConstantValue的屬性值只限於基本類型和String,很明顯這是因為它從常量池中也只能夠引用到基本類型和String類型的字面量。

下面簡要說明下final、static、 final修飾的欄位賦值的區別:

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.