JVM Java字節碼方法表與屬性


方法表

1、methods_count

 method_info,前三個字段和field_info一樣

 

2、方法的屬性結構

方法中的每個屬性都是一個attribut_info結構

JVM定義了部分attribute,但是編譯器自己也可以實現自己的attribute寫入class文件里,供運行時使用。

不同的attribute通過attribute_name_index來區分。

 

JVM規范預定義的attribut

 

3、Code結構

Code attribute 的作用是保存該方法的結構,如所對應的字節碼

 

attribute_length表示attribute所包含的字節數,不包含attribute_name_index和attribute_length字段

max_stack表示這個方法運行的任何時刻所能到達的操作數棧的最大深度。

max_locals 表示方法執行期間創建的局部變量的數目,包含用來表示傳入的參數的局部變量。

code_length表示該方法所包含的字節碼的字節數以及具體的指令嗎

具體字節碼即時該方法被調用時,虛擬機執行的字節碼

exception_table,這里存放的是處理異常的信息

每個exception_table表項由start_pc, end_pc, handler_pc, catch_type組成

start_pc 和end_pc表示在code數組中的從start_pc到end_pc處(包含start_pc,不包含end_pc)的指令拋出的異常會由這個表項來處理。

handler_pc表示處理異常的代碼的開始處。

catch_type表示會被處理的異常類型,它指向常量池里的一個異常類。當catch_type為0時,表示處理所有的異常

 

附加屬性

LineNumberTable: 這個屬性用來表示code數組中的字節碼和Java代碼行數之間的關系。這個屬性可以用來在調試的時候定位代碼執行的行數。

LineNumberTable的結構

 

 

字節碼查看工具

jclasslib

https://github.com/ingokegel/jclasslib

 

Idea上安裝jclasslib插件

插件安裝好后,view里會多出兩項

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM