方法表
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里會多出兩項