在 JVM 類文件結構中,Code 屬性是非抽象方法最關鍵的屬性,它不僅存儲字節碼指令,還包含操作數棧、局部變量表、異常處理、行號對應等核心運行時信息。本文結合結構圖解與實際反編譯案例,深度剖析 Code 屬性及其子屬性結構。

關鍵字段說明:
CONSTANT_Utf8_info,值為 "Code"
每個 exception_info 包含四字段:
Throwable 子類);0 表示 finally 塊語義:若字節碼偏移量在 [start_pc, end_pc) 範圍內拋出 catch_type 類型異常,跳轉至 handler_pc 執行。

javac -g:none)line_number_info 對應一條字節碼指令的源碼行號
local_variable_info 描述一個局部變量生命週期:start_pc - 作用域起始偏移量 length - 作用域長度 name_index - 變量名(常量池索引) descriptor_index - 描述符(常量池索引) index - 局部變量表 Slot 索引

method_info 屬性表中,與 Code 屬性平級throws 子句聲明的受檢異常exceptions_index_table 為常量池索引數組,指向異常類 CONSTANT_Class_infopublic void test() throws Exception {
int localVar = 0;
try {
Class.forName("com.bjpowernode.test.Person");
} catch (ClassNotFoundException e) {
throw e;
} finally {
System.out.println(localVar);
}
}
反編譯結果關鍵點:
max_stack=2, locals=4, args_size=1:棧深 2、4 個 Slot、1 個參數Exception table:兩條記錄分別對應 catch 與 finallyLineNumberTable:精確映射源碼行號到字節碼偏移量LocalVariableTable:包含 this、localVar、e 三個變量
Code 屬性是方法執行的完整藍圖,其子屬性分工明確:字節碼指令驅動執行,異常表保障錯誤處理,行號表與局部變量表支撐開發工具體驗。理解這些結構,是掌握 JVM 運行機制、字節碼操作框架(ASM、Javassist)及性能調優的基石。