access_flags訪問標(biāo)識
常量池結(jié)束后就是這個Class對應(yīng)的訪問標(biāo)志內(nèi)容,用u2(兩個字節(jié))來表示。
?訪問標(biāo)志可以有多個,根據(jù)多個標(biāo)志位的或運算來決定最終的access_flags的取值
?
class的繼承實現(xiàn)關(guān)系
訪問標(biāo)志之后的是this_class,super_class,interfaces_count,interfaces這些數(shù)據(jù)。1.this_class:該Class的權(quán)限定名。( 「通過訪問常量池中的類信息表來定位到類的權(quán)限定名」 )2.super_class:父類的全限定名。(由于Java中是 「單繼承多實現(xiàn)」 的,所以父類索引只有一個,但是接口可以有多個稍后將),跟上面的尋找過程類似,只不過換了一個常量池的索引,「如果沒有顯示使用繼承的話那么最終引用的是Object類的權(quán)限定名,如果明確使用了繼承自哪個類那么最終引用到的就是那個類的權(quán)限定名」
3.interfaces和interfaces_count 剛剛說了Class是可以多實現(xiàn)的,所以
interfaces_count為 「該Class實現(xiàn)接口的數(shù)量」 (如果沒有任何實現(xiàn)的接口,那么該值為0后面的interfaces將沒有數(shù)據(jù)不占用任何字節(jié));
interfaces為實現(xiàn)接口的對應(yīng)接口的全限定名
字段表
「該表結(jié)構(gòu)用于描述接口/類中聲明的變量」 。
變量可以分為類變量(static級別的),實例變量。
?注意:該部分不包括方法中的局部變量字段,局部變量會有一個單獨的局部變量表來存儲,下一篇文章講解。對于Class文件中最外層的字段表中存儲的只是類變量和實例變量。
?
而字段有哪些數(shù)據(jù)需要表示呢?權(quán)限修飾符,字段名稱,字段數(shù)據(jù)類型,類級別還是實例級別(是否有static修飾符),可變性(final),并發(fā)可見性(volatile修飾符,強制從主內(nèi)存讀寫),是否可以被序列化(transient修飾符)
access_flags訪問標(biāo)識
這個訪問標(biāo)識和前面講的類的access_flags不一樣,這個是字段的訪問標(biāo)識
名稱索引和描述符的索引
這兩個索引都是在常量池中的索引,對常量池的引用
name_index為 「字段的名稱」 descriptor_index為描述符,對應(yīng)于字段來說是該**「字段的數(shù)據(jù)類型」**
描述符的含義:
?對于一維數(shù)組來說使用“[”來表示,如果是二位就用兩個“[[”。比如類型為String的二維數(shù)組(String[][])用描述符來表示就是[[ java.lang.String;一維數(shù)組“int[]”就是[I
?
存儲額外信息
可以看到描述符后面還有一個屬性表集合,該集合是用來**「存儲一些額外的信息,可以添加0到多個信息?!?*
如果沒有額外描述的信息attributes_count就是0,后面沒有字節(jié)去描述屬性表;如果有額外的信息比如將字段聲明為final的話,屬性表中就會存儲一個ConstantValue的屬性,這個值指向?qū)?yīng)的常量值。(關(guān)于這部分內(nèi)容之后進行詳解)
?該字段表中不會記錄父類中或者父接口中繼承來的字段,但是有可能出現(xiàn)原本不存在的字段,比如在內(nèi)部類中添加字段來訪問外部類。
?
?重載字段:對于Class文件來說剛剛看了,只要描述符不一致,字段名一樣也是可以被記錄到Class中的而不會引起沖突;但是對于Java語言來說字段是不能重載的,不管描述符一樣不一樣,「名稱必須不一樣!??!」
?
方法表
「該表結(jié)構(gòu)用于描述接口/類中聲明的變量」
「圖例:」
可以看到和上面講的字段表結(jié)構(gòu)大致是一樣的。
access_flags訪問標(biāo)識
名稱索引和描述符的索引
這兩個索引都是在常量池中的索引,對常量池的引用
name_index為 「方法的名稱」 descriptor_index為描述符,對應(yīng)于方法來說是該 「方法的參數(shù)集合和返回值類型」 對應(yīng)的數(shù)據(jù)在上面講字段表的時候已經(jīng)貼過圖,不在說明。
存儲額外信息
這個里面的屬性表中就會有各種各樣的表來存儲一個方法的額外信息,比如方法體中的代碼,局部變量表等等表結(jié)構(gòu)數(shù)據(jù)類型。(下一篇文章進行詳解)
?和字段表一樣如果父類方法沒有被子類重寫,那么該表中不會記錄父類方法的信息的,但是同樣可以出現(xiàn)一些編譯器添加的方法,比如類構(gòu)造器clvinit()和實例構(gòu)造器init()
?
?重載方法:名稱一樣,方法的特征簽名不一樣。對于Class文件來說方法的特征簽名不同(描述符不完全一致)就可以進行重載不會發(fā)生沖突;但是對于Java語言來說方法的特征簽名中不包括返回值這個條件所以返回值不同不能作為重載的條件 Java代碼層面的方法特征簽名,Java代碼的方法特征簽名只包括方法名稱、參數(shù)順序及參數(shù)類型,而字節(jié)碼Class的特征簽名還包括方法返回值以及受查異常表,請讀者根據(jù)上下文語境注意區(qū)分。
-
JAVA
+關(guān)注
關(guān)注
19文章
2977瀏覽量
105240 -
C語言
+關(guān)注
關(guān)注
180文章
7616瀏覽量
137892 -
Class
+關(guān)注
關(guān)注
0文章
53瀏覽量
19777 -
JVM
+關(guān)注
關(guān)注
0文章
158瀏覽量
12273
發(fā)布評論請先 登錄
相關(guān)推薦
jvm的類加載器的整體結(jié)構(gòu)及過程解析
![<b class='flag-5'>jvm</b>的類加載器的整體<b class='flag-5'>結(jié)構(gòu)</b>及過程解析](https://file.elecfans.com/web1/M00/C8/88/o4YBAF9wQzuASvvjAAAYyn9-zNc508.png)
Jvm的整體結(jié)構(gòu)和特點
Jvm工作原理學(xué)習(xí)筆記
Java:JVM虛擬機的入門知識
![Java:<b class='flag-5'>JVM</b>虛擬機的<b class='flag-5'>入門</b>知識](https://file.elecfans.com/web1/M00/BF/B9/o4YBAF78BR-AHchxAAGQhzO2hWA656.png)
JVM入門之Class結(jié)構(gòu)介紹1
![<b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>介紹</b>1](https://file.elecfans.com/web2/M00/8F/92/poYBAGPks6CAPWHuAAQDKx4zafw816.png)
JVM入門之Class結(jié)構(gòu)屬性表1
![<b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b>屬性表1](https://file.elecfans.com/web2/M00/90/3E/pYYBAGPls16AG92RAAT2cB0CcY4811.jpg)
JVM入門之Class結(jié)構(gòu)屬性表2
![<b class='flag-5'>JVM</b><b class='flag-5'>入門</b><b class='flag-5'>之</b><b class='flag-5'>Class</b><b class='flag-5'>結(jié)構(gòu)</b>屬性表<b class='flag-5'>2</b>](https://file.elecfans.com/web2/M00/8F/BA/poYBAGPls16ANZ7JAAN7Re9jKmQ120.jpg)
垃圾收集器的JVM參數(shù)配置
![垃圾收集器的<b class='flag-5'>JVM</b>參數(shù)配置](https://file1.elecfans.com/web2/M00/A7/6D/wKgaomUjux-ANVLUAAChVNUuCZ0773.jpg)
評論