access_flags訪問標識
常量池結束后就是這個Class對應的訪問標志內容,用u2(兩個字節)來表示。
?訪問標志可以有多個,根據多個標志位的或運算來決定最終的access_flags的取值
?
class的繼承實現關系
訪問標志之后的是this_class,super_class,interfaces_count,interfaces這些數據。1.this_class:該Class的權限定名。( 「通過訪問常量池中的類信息表來定位到類的權限定名」 )2.super_class:父類的全限定名。(由于Java中是 「單繼承多實現」 的,所以父類索引只有一個,但是接口可以有多個稍后將),跟上面的尋找過程類似,只不過換了一個常量池的索引,「如果沒有顯示使用繼承的話那么最終引用的是Object類的權限定名,如果明確使用了繼承自哪個類那么最終引用到的就是那個類的權限定名」3.interfaces和interfaces_count 剛剛說了Class是可以多實現的,所以
interfaces_count為 「該Class實現接口的數量」 (如果沒有任何實現的接口,那么該值為0后面的interfaces將沒有數據不占用任何字節);
interfaces為實現接口的對應接口的全限定名
字段表
「該表結構用于描述接口/類中聲明的變量」 。
變量可以分為類變量(static級別的),實例變量。
?注意:該部分不包括方法中的局部變量字段,局部變量會有一個單獨的局部變量表來存儲,下一篇文章講解。對于Class文件中最外層的字段表中存儲的只是類變量和實例變量。
?
而字段有哪些數據需要表示呢?權限修飾符,字段名稱,字段數據類型,類級別還是實例級別(是否有static修飾符),可變性(final),并發可見性(volatile修飾符,強制從主內存讀寫),是否可以被序列化(transient修飾符)
access_flags訪問標識
這個訪問標識和前面講的類的access_flags不一樣,這個是字段的訪問標識
名稱索引和描述符的索引
這兩個索引都是在常量池中的索引,對常量池的引用
name_index為 「字段的名稱」 descriptor_index為描述符,對應于字段來說是該**「字段的數據類型」**
描述符的含義:
?對于一維數組來說使用“[”來表示,如果是二位就用兩個“[[”。比如類型為String的二維數組(String[][])用描述符來表示就是[[ java.lang.String;一維數組“int[]”就是[I
?
存儲額外信息
可以看到描述符后面還有一個屬性表集合,該集合是用來**「存儲一些額外的信息,可以添加0到多個信息。」**
如果沒有額外描述的信息attributes_count就是0,后面沒有字節去描述屬性表;如果有額外的信息比如將字段聲明為final的話,屬性表中就會存儲一個ConstantValue的屬性,這個值指向對應的常量值。(關于這部分內容之后進行詳解)
?該字段表中不會記錄父類中或者父接口中繼承來的字段,但是有可能出現原本不存在的字段,比如在內部類中添加字段來訪問外部類。
?
?重載字段:對于Class文件來說剛剛看了,只要描述符不一致,字段名一樣也是可以被記錄到Class中的而不會引起沖突;但是對于Java語言來說字段是不能重載的,不管描述符一樣不一樣,「名稱必須不一樣!!!」
?
方法表
「該表結構用于描述接口/類中聲明的變量」
「圖例:」
可以看到和上面講的字段表結構大致是一樣的。
access_flags訪問標識
名稱索引和描述符的索引
這兩個索引都是在常量池中的索引,對常量池的引用
name_index為 「方法的名稱」 descriptor_index為描述符,對應于方法來說是該 「方法的參數集合和返回值類型」 對應的數據在上面講字段表的時候已經貼過圖,不在說明。
存儲額外信息
這個里面的屬性表中就會有各種各樣的表來存儲一個方法的額外信息,比如方法體中的代碼,局部變量表等等表結構數據類型。(下一篇文章進行詳解)
?和字段表一樣如果父類方法沒有被子類重寫,那么該表中不會記錄父類方法的信息的,但是同樣可以出現一些編譯器添加的方法,比如類構造器clvinit()和實例構造器init()
?
?重載方法:名稱一樣,方法的特征簽名不一樣。對于Class文件來說方法的特征簽名不同(描述符不完全一致)就可以進行重載不會發生沖突;但是對于Java語言來說方法的特征簽名中不包括返回值這個條件所以返回值不同不能作為重載的條件 Java代碼層面的方法特征簽名,Java代碼的方法特征簽名只包括方法名稱、參數順序及參數類型,而字節碼Class的特征簽名還包括方法返回值以及受查異常表,請讀者根據上下文語境注意區分。
-
JAVA
+關注
關注
19文章
2960瀏覽量
104565 -
C語言
+關注
關注
180文章
7601瀏覽量
136251 -
Class
+關注
關注
0文章
53瀏覽量
19714 -
JVM
+關注
關注
0文章
157瀏覽量
12211
發布評論請先 登錄
相關推薦
評論