中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java字節(jié)碼結構剖析二:字段表

2018-11-20    來源:importnew

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

上篇介紹了字節(jié)碼文件的結構和其常量池分析。緊接其后呢,我們要去了解字段表的概念和組成結構。接著上篇里的字節(jié)碼的常量池往后分析。

access_flags

訪問標志信息包括該class文件是類還是接口,是否定義成public,是否是abstract,如果是類,是否被申明為final。access_flags 的取值范圍和相應含義見下表。

我們的字節(jié)碼里該位置的16進制表示是0×0021。0×0021=0×0001 ^ 0×0020。即代表該類的訪問修飾是public的。ACC_SUPER這里不做介紹,看看JVM規(guī)范對他的描述,了解即可。

ACC_SUPER 標志用于確定該 Class 文件里面的 invokespecial 指令使用的是哪一種執(zhí)行語義。目前 Java 虛擬機的編譯器都應當設置這個標志。ACC_SUPER 標記是為了向后兼容舊編譯器編譯的 Class 文件而存在的,在 JDK1.0.2 版本以前的編譯器產(chǎn)生的 Class 文件中,access_flag 里面沒有 ACC_SUPER 標志。同時,JDK1.0.2 前的 Java 虛擬機遇到 ACC_SUPER 標記會自動忽略它。

this_class_name

類索引,this_class 的值必須是對 constant_pool 表中項目的一個有效索引值。constant_pool 表在這個索引處的項必須為 CONSTANT_Class_info 類型常量,表示這個 Class 文件所定義的類或接口。

在我的字節(jié)碼文件中,該16進制值為0×0005=5。通過常量池信息,最終他指向的是一個utf-8字符串,com/shengsiyuan/jvm/bytecode/MyTest2。即類的全限定名。

  #5 = Class              #38            // com/shengsiyuan/jvm/bytecode/MyTest2
  #38 = Utf8              com/shengsiyuan/jvm/bytecode/MyTest2

super_class_name

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

在字節(jié)碼文件中,父類索引為0x000A=10。即父類是 java/lang/Object。

 #10 = Class              #43            // java/lang/Object
 #43 = Utf8               java/lang/Object

interfaces_count

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

我們的代碼沒有實現(xiàn)任何接口,所以該項值為0,即0×0000。

interfaces[]

接口表,interfaces[]數(shù)組中的每個成員的值必須是一個對 constant_pool 表中項目的一個有效索引值,它的長度為 interfaces_count。

我們代碼沒有接口,所以我們的字節(jié)碼文件里沒有這項了。所以 interfaces_count 后面就直接是字段計數(shù)器和字段表。

fields_count

字段計數(shù)器,fields_count 的值表示當前 Class 文件 fields[]數(shù)組的成員個數(shù)。也就是當前類的類字段和實例字段的個數(shù)。

我們源代碼里定義了3個字段,1個類字段,2個實例字段。所以fields_count為3。查看對應字節(jié)碼文件的16進制表示0×0003=3。

fields[]

字段表用于描述類和接口中聲明的變量。這里的字段包含了類級別變量以及實例變量,但是不包括方法內(nèi)部聲明的局部變量。

field_info結構格式如下:

field_info {
    u2 access_flags;
    u2 name_index;
    u2 descriptor_index;
    u2 attributes_count;
    attribute_info attributes[attributes_count];
}

access_flags 項的值是用于定義字段被訪問權限和基礎屬性的掩碼標志。access_flags 的取值范圍和相應含義見如下表:

看在我字節(jié)碼中的16進制表示,0×0000=0。0代表沒有修飾符的意思。看我們的源碼:String str = “Welcome”;,即默認修飾符。

  • name_index 項的值必須是對常量池的一個有效索引。常量池在該索引處的項必須是CONSTANT_Utf8_info結構,表示一個有效的字段的非全限定名。

在字節(jié)碼里是0x000B=11。常量池11處:

#11 = Utf8               str

表示字段的名稱為“str”。

  • descriptor_index 項的值必須是對常量池的一個有效索引。常量池在該索引處的項必須是CONSTANT_Utf8_info結構,表示一個有效的字段的描述符。

字節(jié)碼中,0x000C=12。看常量池:

#12 = Utf8               Ljava/lang/String;

表示該字段是String類型。

在JVM規(guī)范中,每個變量/字段都有描述信息,描述信息主要作用是描述字段的數(shù)據(jù)類型、方法的參數(shù)列表(包括數(shù)量,類型與順序)與返回值。根據(jù)描述符規(guī)則,基本數(shù)據(jù)類型和代表無返回值的void類型都用一個大寫字符來表示,對象類型則使用字符L加對象的全限定名稱來表示。為了壓縮字節(jié)碼文件的體積,對于基本數(shù)據(jù)類型,JVM都只使用一個大寫字母表示,如下所示:B-byte、C-char、D-double、F-float、I-int、J-long、S-short、Z-boolean、V-void、L-對象類型,如Ljava/lang/String。
對于數(shù)組類型來說,每一個緯度使一個前置的[表示,如int[]被記錄為[I,String[][]被記錄為[[Ljava/lang/String;。

  • attributes_count的項的值表示當前字段的附加屬性的數(shù)量。

在字節(jié)碼里,0x0000=0。即該字段沒有附加屬性。

  • attributes[]

attributes 表的每一個成員的值必須是 attribute結構,一個字段可以有任意個關聯(lián)屬性。

因為該字段沒有附加屬性,所以這項數(shù)據(jù)沒有。

以上就是字段表里的第1個字段的完整字節(jié)碼信息描述。也就是我們定義的『str』字段的信息。我們代碼里還有2個字段 private int x = 5public static Integer in = 10。我便不再描述了,大家可以緊接著我后面把這兩個字段的信息解析出來。

標簽: 代碼 權限

版權申明:本站文章部分自網(wǎng)絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Java字節(jié)碼結構剖析三:方法表

下一篇:本機搭建三節(jié)點k8s集群