Class 文件、字段表、方法表均可攜帶屬性表集合,用於描述特定場景的專有信息。JVM 預定義了 20 多種屬性,本文重點講解最核心的 Code、Exceptions、LineNumberTable 等屬性結構。
| 類型 | 名稱 | 數量 |
|---|---|---|
| u2 | attribute_name_index | 1 |
| u4 | attribute_length | 1 |
| u1 | info | attribute_length |
屬性名從常量池引用 CONSTANT_Utf8_info,值結構自定義,長度由 attribute_length 指定。
| 屬性名稱 | 使用位置 | 含義 |
|---|---|---|
| Code | 方法表 | Java 代碼編譯的字節碼指令 |
| ConstantValue | 字段表 | final 常量值 |
| Deprecated | 類/方法/字段 | 標記棄用 |
| Exceptions | 方法表 | 方法拋出的受查異常 |
| InnerClasses | 類文件 | 內部類列表 |
| LineNumberTable | Code 屬性 | 源碼行號與字節碼對應 |
| LocalVariableTable | Code 屬性 | 方法局部變量描述 |
| SourceFile | 類文件 | 源文件名 |
| Signature | 類/方法/字段 | 泛型簽名支持 |
| RuntimeVisibleAnnotations | 類/方法/字段 | 運行時可見注解 |
存放方法體字節碼,結構:
| 項目 | 類型 | 說明 |
|---|---|---|
| max_stack | u2 | 操作數棧最大深度 |
| max_locals | u2 | 局部變量表大小 |
| code_length | u4 | 字節碼長度 |
| code | u1[] | 字節碼指令流 |
| exception_table | exception_info[] | 異常處理表 |
| attributes | attribute_info[] | 嵌套屬性(如 LineNumberTable) |
接口方法、抽象方法、native 方法無 Code 屬性。
列出方法 throws 聲明的受查異常:
| 項目 | 類型 |
|---|---|
| number_of_exceptions | u2 |
| exception_index_table[] | u2[] |
每項為常量池 CONSTANT_Class_info 索引。
建立源碼行號與字節碼偏移量映射,供調試器定位:
| 項目 | 類型 |
|---|---|
| line_number_table_length | u2 |
| line_number_info[] | {start_pc, line_number} |
提示: 現代開發無需手工解析十六進制,推薦使用
javap -v、jclasslib、IDEA 插件等工具直接查看結構化輸出。