1. 程式人生 > >JAVA位元組碼檔案之第三篇(訪問標識)

JAVA位元組碼檔案之第三篇(訪問標識)

一、Access Flags 訪問標誌

訪問標誌資訊包括該 Class 檔案是類還是介面,是否被定義成 public 或者 abstract , 如果是類,是否被宣告成 final。

訪問標誌表

 

 

 

二、Access Flags 的分析

 

 

 通過上一篇JAVA位元組碼檔案之第二篇(常量池)的分析可知該class檔案的常量池結束部分在 63 74的位置

 

 

 Access Flags 佔2個位元組,所以該位元組碼檔案的訪問標誌是00 21,0x0021在 Access Flags 中是0x0020和0x0001的並集,表示 ACC PUBLIC與 ACC SUPER合併的結果。說明該類的宣告修飾是public並且繼承Object

三、This Class Name 的分析

This Class Name 佔 Access Flags之後的兩個位元組所以是00 03。索引等於3,對應常量池中的#22 ,就是當前類的名稱

 四、Super class Name 的分析

Super class Name佔 this Class Name 之後的兩個位元組所以是 00 04。索引等於4,對應常量池中的#4,就是當前類的父類

 

 五、Interface 的分析

Interface 佔Super class Name 之後的 2+n個byte,前兩個byte是介面的數量,之後的n個byte表示介面的具體資訊。

由於 Interface num=00 00 ;所以該類沒有實現任何介面,也就是沒有索引與常量池進行匹配。

六、Fields 的分析

Fields的範圍:欄位表用於描述類和介面中宣告的變數。這裡的欄位包含了類級別變數(靜態變數)以及例項變數,但是不包括方法內部宣告的區域性變數

屬性表集合:

Fields 佔 Interface 之後的2+n個byte,前兩個byte是Fields 的數量,之後的n個byte表示Fields的具體資訊。

由於 Fields num= 00 01;所以該類具有一個成員變數。

u2 access_flags :00 02 ,訪問標識的是0002,ACC_PRIVATE

u2 name_index: 00 05,名字的索引是5,對應常量池的#5

u2 descriptor_index :00 06,描述符的索引是6,對應常量池的#6 ,所以變數的型別是int

u2 attributes_count:00 00 ,擴充套件屬性為0,所以該變數沒有擴充套件屬性,所以就不存在 attribute_info 

attribute_info attributes[attributes_count];

 

 

0x0