首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Class 文件格式深度解析:字段與方法結構詳解

     編輯:Java 相關知識

fields_count 與 fields - 字段表結構

fields_count 表示當前類聲明的字段數量(含靜態字段,不含繼承字段)。fields 是長度為 fields_count 的 field_info 數組。

field_info 結構詳解

field_info 結構圖

1. access_flags - 訪問標志(2 字節)

字段訪問標志表

常見標志:ACC_PUBLIC(0x0001)、ACC_PRIVATE(0x0002)、ACC_PROTECTED(0x0004)、ACC_STATIC(0x0008)、ACC_FINAL(0x0010)、ACC_VOLATILE(0x0040)、ACC_TRANSIENT(0x0080)、ACC_SYNTHETIC(0x1000)、ACC_ENUM(0x4000)。

2. name_index - 字段名索引(2 字節)

指向常量池 CONSTANT_Utf8_info,存儲字段簡單名稱(如 computer)。

3. descriptor_index - 描述符索引(2 字節)

指向常量池 CONSTANT_Utf8_info,存儲字段類型描述符(如 Lcom/bjpowernode/test/Computer;)。

4. attributes_count & attributes - 屬性表

字段屬性類型:ConstantValue(final 靜態常量值)、Deprecated、Synthetic(編譯器生成,如內部類外部引用)。

實戰驗證:反編譯分析

public class Programer extends Person {
    private Computer computer;
    public Programer(Computer computer) { this.computer = computer; }
    public void doWork() { computer.calculate(); }
}

反編譯輸出:

Constant pool:
#5 = Utf8 computer
#6 = Utf8 Lcom/bjpowernode/test/Computer;

{ 
  private com.bjpowernode.test.Computer computer;
  flags: ACC_PRIVATE
}

field_info 引用常量池示意圖

字段 computer 對應的 field_info:access_flags=ACC_PRIVATE、name_index=#5、descriptor_index=#6。


methods_count 與 methods - 方法表結構

methods_count 表示當前類聲明的方法數(含靜態方法、構造方法 <init>、類初始化器 <clinit>,不含繼承方法)。methods 是 method_info 數組。

method_info 結構(與 field_info 高度相似)

method_info 結構圖

1. access_flags - 方法訪問標志

方法訪問標志表

新增標志:ACC_SYNCHRONIZED(0x0020)、ACC_BRIDGE(0x0040)、ACC_VARARGS(0x0080)、ACC_NATIVE(0x0100)、ACC_ABSTRACT(0x0400)、ACC_STRICT(0x0800)。

2. name_index - 方法名索引

指向常量池 CONSTANT_Utf8_info(如 <init>、doWork)。

3. descriptor_index - 方法描述符索引

格式:(參數類型描述符)返回類型描述符。如 (LComputer;)V 表示接收 Computer 參數、返回 void。

4. attributes_count & attributes - 方法屬性表

關鍵屬性:

  • Code:存儲字節碼指令、操作數棧、局部變量表、異常表——方法執行核心
  • Exceptions:聲明拋出的檢查型異常
  • Deprecated、Synthetic

實戰驗證:同類反編譯方法表

Constant pool:
#7 = Utf8 <init>
#8 = Utf8 (Lcom/bjpowernode/test/Computer;)V
#12 = Utf8 ()V
#19 = Utf8 doWork

{
  public com.bjpowernode.test.Programer(com.bjpowernode.test.Computer);
  flags: ACC_PUBLIC
  public void doWork();
  flags: ACC_PUBLIC
}

method_info 引用常量池示意圖

  • 構造方法:name_index=#7(<init>)、descriptor_index=#8
  • doWork:name_index=#19、descriptor_index=#12

總結

結構計數器數組元素核心索引引用
字段表fields_countfield_info[]name_index、descriptor_index → CONSTANT_Utf8
方法表methods_countmethod_info[]name_index、descriptor_index → CONSTANT_Utf8;attributes → Code/Exceptions

Class 文件通過常量池索引實現符號引用,字段與方法表結構高度一致,核心差異在於屬性表內容(方法包含 Code 屬性)。下篇將深入解析 Code、Exceptions 等關鍵屬性結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved