《Java虛擬機器原理圖解》1.4 class檔案中的欄位表集合--field欄位在class檔案中是怎樣組織的,虛擬機器連網圖解教程

來源:互聯網
上載者:User

《Java虛擬機器原理圖解》1.4 class檔案中的欄位表集合--field欄位在class檔案中是怎樣組織的,虛擬機器連網圖解教程
0.前言

         瞭解JVM虛擬機器原理是每一個Java程式員修鍊的必經之路。但是由於JVM虛擬機器中有很多的東西講述的比較寬泛,在當前接觸到的關於JVM虛擬機器原理的教程或者部落格中,絕大部分都是充斥的文字性的描述,很難給人以形象化的認知,看完之後感覺還是稀裡糊塗的。

         感於以上的種種,我打算把我在學習JVM虛擬機器的過程中學到的東西,結合自己的理解,總結成《Java虛擬機器原理圖解》 這個系列,以圖解的形式,將抽象的JVM虛擬機器的知識具體化,希望能夠對想瞭解Java虛擬機器原理的的Java程式員 提供點協助。


讀完本文,你將會學到:

1、類中定義的field欄位是如何在class檔案中組織的

2、不同的資料類型在class檔案中是如何表示的

3、static final類型的field欄位的初始化賦值問題

1.概述

     欄位表集合是指由若干個欄位表(field_info)組成的集合。對於在類中定義的若干個欄位,經過JVM編譯成class檔案後,會將相應的欄位資訊組織到一個叫做欄位表集合的結構中,欄位表集合是一個類數組結構,如所示:

注意:這裡所講的欄位是指在類中定義的靜態或者非靜態變數,而不是在類中的方法內定義的變數。請注意區別。

比如,如果某個類中定義了5個欄位,那麼,JVM在編譯此類的時候,會產生5個欄位表(field_info)資訊,然後將欄位表集合中的欄位計數器的值設定成5,將5個欄位表資訊依次放置到欄位計數器的後面。

2. 欄位表集合在class檔案中的位置

欄位表集合緊跟在class檔案的介面索引集合結構的後面,如所示:


3. Java中的一個Field欄位應該包含那些資訊?------欄位表field_info結構體的定義    

  

    針對上述的欄位表示,JVM虛擬機器規範規定了field_info結構體來描述欄位,其表示資訊如下:

下面我將一一講解FIeld_info的組成元素:訪問標誌(access_flags)、名稱索引(name_index)、描述索引(descriptor_index)、屬性工作表集合

 4. field欄位的訪問標誌

     如所示定義的field_info結構體,field欄位的訪問標誌(access_flags)佔有兩個位元組,它能夠表述的資訊如下所示:

舉例:如果我們在某個類中有定義field域:private static String str;,那麼在訪問標誌上,第15位ACC_PRIVATE和第13位ACC_STATIC標誌位都應該為1。field域str的訪問標誌資訊應該是如下所示:


如所示,str欄位的訪問標誌的值為0x000A,它由兩個修飾符ACC_PRIVATE和ACC_STATIC組成。

根據給定的訪問標誌(access_flags),我們可以通過以下運算來得到這個域有哪些修飾符:

上面列舉的str欄位的訪問標誌的值為000A,那麼分別域上述的標誌符的特徵值取&,結果為1的只有ACC_PRIVATE和ACC_STATIC,所以該欄位的標誌符只有有ACC_PRIVATE和ACC_STATIC。



5. 欄位的資料類型表示和欄位名稱表示

class檔案對資料類型的表示如所示:



field欄位名稱,我們定義了一個形如private static String str的field欄位,其中"str"就是這個欄位的名稱。

class檔案將欄位名稱和field欄位的資料類型表示作為字串儲存在常量池中。在field_info結構體中,緊接著訪問標誌的,就是欄位名稱索引和欄位描述符索引,它們分別佔有兩個位元組,其內部儲存的是指向了常量池中的某個常量池項的索引,對應的常量池項中儲存的字串,分別表示該欄位的名稱和欄位描述符。


6.屬性工作表集合-----靜態field欄位的初始化

在定義field欄位的過程中,我們有時候會很自然地對field欄位直接賦值,如下所示:

public static final int MAX=100;public  int count=0;
對於虛擬機器而言,上述的兩個field欄位賦值的時機是不同的:

  •        對於非靜態(即無static修飾)的field欄位的賦值將會出現在執行個體構造方法<init>()中
  •        對於靜態field欄位,有兩個選擇:1、在靜態構造方法<cinit>()中進行;2 、使用ConstantValue屬性進行賦值
Sun javac編譯器對於靜態field欄位的初始化賦值策略

目前的Sun javac編譯器的選擇是:如果使用final和static同時修飾一個field欄位,並且這個欄位是基本類型或者String類型的,那麼編譯器在編譯這個欄位的時候,會在對應的field_info結構體中增加一個ConstantValue類型的結構體,在賦值的時候使用這個ConstantValue進行賦值;如果該field欄位並沒有被final修飾,或者不是基本類型或者String類型,那麼將在類構造方法<cinit>()中賦值。

對於上述的public static final init MAX=100;   javac編譯器在編譯此field欄位構建field_info結構體時,除了訪問標誌、名稱索引、描述符索引外,會增加一個ConstantValue類型的屬性工作表。


7.執行個體解析:

定義如下一個簡單的Simple類,然後通過查看Simple.class檔案內容並結合javap -v Simple 產生的常量池內容,分析str field欄位的結構:

package com.louis.jvm;public class Simple {private  transient static final String str ="This is a test";}


註:

1. 欄位計數器中的值為0x0001,表示這個類就定義了一個field欄位
2. 欄位的訪問標誌是0x009A,二進位是00000000 10011010,即第9、12、13、15位標誌位為1,這個欄位的標誌符有:ACC_TRANSIENT、ACC_FINAL、ACC_STATIC、ACC_PRIVATE;

3. 名稱索引中的值為0x0005,指向了常量池中的第5項,為“str”,表明這個field欄位的名稱是str;

4. 描述索引中的值為0x0006,指向了常量池中的第6項,為"Ljava/lang/String;",表明這個field欄位的資料類型是java.lang.String類型;

5.屬性工作表計數器中的值為0x0001,表明field_info還有一個屬性工作表;

6.屬性工作表名稱索引中的值為0x0007,指向常量池中的第7項,為“ConstantValue”,表明這個屬性工作表的名稱是ConstantValue,即屬性工作表的類型是ConstantValue類型的;

7.屬性長度中的值為0x0002,因為此屬性工作表是ConstantValue類型,它的值固定為2;

8.常量值索引 中的值為0x0008,指向了常量池中的第8項,為CONSTANT_String_info類型的項,表示“This is a test” 的常量。在對此field賦值時,會使用此常量對field賦值。







作者的話

    本文是《Java虛擬機器原理圖解》系列的其中一篇,如果您有興趣,請關注該系列的其他文章~

   覺得本文不錯,順手點個贊哦~~您的鼓勵,是我繼續分享知識的強大動力!

    

 

-----------------------------------------------------------------------------------------------------------------------------------------

                                                                              本文源自  http://blog.csdn.net/luanlouis/,如需轉載,請註明出處,謝謝!



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.