JVM-class檔案完全解析-屬性工作表集合,jvm-class集合

來源:互聯網
上載者:User

JVM-class檔案完全解析-屬性工作表集合,jvm-class集合
 屬性工作表集合

  在前面魔數,次版本號碼,主板本號,常量池入口,常量池,訪問標誌,類索引,父類索引,介面索引集合,欄位表集合,方法表集合,那麼接下來就是屬性工作表集合了. 

 

  在class檔案,欄位表,方法表都可以攜帶自己的屬性工作表集合(像前面方法表的時候就用到"code"這個屬性工作表)以用於描述某些情境專有的資訊.

  虛擬機器中預定義的屬性:

屬性名稱 使用位置 含義
Code 方法表 Java代碼編譯成的位元組碼指令
ConstantValue 欄位表 final關鍵字定義的常量池
Deprecated 類,方法,欄位表 被聲明為deprecated的方法和欄位
 Exceptions 方法表  方法拋出的異常 
 EnclosingMethod 類檔案  僅當一個類為局部類或者匿名類是才能擁有這個屬性,這個屬性用於標識這個類所在的外圍方法 
 InnerClass 類檔案  內部類列表 
 LineNumberTable Code屬性  Java源碼的行號與位元組碼指令的對應關係 
 LocalVariableTable Code屬性  方法的局部便狼描述 
 StackMapTable Code屬性  JDK1.6中新增的屬性,供新的類型檢查檢驗器檢查和處理目標方法的局部變數和運算元有所需要的類是否匹配 
 Signature 類,方法表,欄位表   用於支援泛型情況下的方法簽名
 SourceFile 類檔案  記錄源檔案名稱 
 SourceDebugExtension 類檔案  用於儲存額外的調試資訊 
 Synthetic 類,方法表,欄位表  標誌方法或欄位為編譯器自動產生的 
 LocalVariableTypeTable 類  使用特徵簽名代替描述符,是為了引入泛型文法之後能描述泛型參數化型別而添加 
 RuntimeVisibleAnnotations 類,方法表,欄位表  為動態註解提供支援 
 RuntimeInvisibleAnnotations 表,方法表,欄位表  用於指明哪些註解是運行時不可見的 
 RuntimeVisibleParameterAnnotation 方法表  作用與RuntimeVisibleAnnotations屬性類似,只不過作用對象為方法
 RuntimeInvisibleParameterAnnotation   方法表  作用與RuntimeInvisibleAnnotations屬性類似,作用對象哪個為方法參數
 AnnotationDefault  方法表 用於記錄註解類元素的預設值 
 BootstrapMethods 類檔案  用於儲存invokeddynamic指令引用的引導方式限定符  

  對於每個屬性,它的名稱需要從常量池中引用一個CONSTANT_utf8_info類型的常量類表示,而屬性值的結構則是完全自訂的,只需要通過一個u4的長度屬性區說明屬性值所佔用的位元即可.

  屬性工作表定義的結構:  

類型 名稱 數量
u2 attribute_name_index 1
u2 attribute_length 1
u1 info attribute_length

 

 Code屬性

  Java程式方法體中的代碼經過Javac編譯處理後,最終變為位元組碼指令儲存在Code屬性中.Code屬性出現在方法表的屬性集合中,但是並非所有的方法表都有這個屬性.例如介面或類中的方法就不存在Code屬性了.

  在位元組碼指令之後的是方法的是方法的顯式異常處理表集合,異常表對於Code屬性來說並不是必須參在的.

  結構:  

類型 名稱 數量
u2 attribute_name_index 1
u4 attribute_length 1
u2 max_stack 1
u2 max_locals 1
u4 code_length 1
u1 code code_length
u2 exception_table_length 1
exception_info exception_table exception_length
u2 attributes_count 1
attribute_info attributes attributes_count

   

 Exceptions屬性

  Exception屬性的作用是列出方法中能拋出的受查異常Check Exceptions,也就是方法描述時在throws關鍵字之後列舉的異常

  結構:

類型 名稱 數量
u2 attribute_name_index 1
u2 attribute_lrngth 1
u2 attribute_of_exception 1
u2 exception_index_tsble number_of_exceptions

  Exception屬性中的number_of_exceptions項表示方法可能拋出的number_of_exceptions種受查異常,每一種受查異常使用一個exception_index_tsble項表示,exception_index_tsble是一個指向常量池中CONSTANT_Class_info型常量的索引,代表了該受查異常的類型.

 LineNumberTable屬性

  結構:

類型 名稱 數量
u2 attribute_name_index 1
u4 attribute_length 1
u2 line_number_table_length 1
line_number_info line_number_table line_number_table_length

  line_number_table是一個數量為line_number_table_length,類型為line_number_info的集合,line_number_info表包括了start_PC和line_number兩個u2類型的資料項目,前者是位元組碼行號,後者是Java原始碼行號.

 

虛擬機器預定義的屬性有20多個,就不意一一介紹,基本上和上述的幾個屬性差不多.

到這裡calss檔案的檔案解析也終於要告一段落了(寫了好長時間,其實我最討厭看這些位元組碼了,其實一般程式員只需要瞭解一下class檔案的構成和原理就行了,解析class檔案的工具有很多,我們可以直接看解析出來的檔案就可以了).

聯繫我們

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