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

Java Class 文件格式深度解析:常量池數據類型詳解(二)

     編輯:Java 相關知識

常量池 11 種數據項類型(續)

8. CONSTANT_Class_info - 類/接口符號引用

CONSTANT_Class_info 結構

  • tag = 7
  • name_index:指向 `CONSTANT_Utf8_info`,存儲**全限定名**(如 `java/lang/Object`)

數組類型特殊處理:

Java 類型Class_info 存儲描述符
Objectjava/lang/Object
Object[][Ljava/lang/Object;
int[][I
int[][][[I

引用 System 類示例

9. CONSTANT_Fieldref_info - 字段符號引用

構成:`class_index` + `name_and_type_index`

  • tag = 9
  • class_index → `CONSTANT_Class_info`(字段所在類)
  • name_and_type_index → `CONSTANT_NameAndType_info`(字段名 + 描述符)

**符號引用本質** = 類信息 + 名稱類型信息

實戰驗證

public class TestInt {
    int a = 10;
    void print() { System.out.println(a); }
}

反編譯常量池:

#1 = Class #2            // com/bjpowernode/test/TestInt
#2 = Utf8 com/bjpowernode/test/TestInt
#5 = Utf8 a
#6 = Utf8 I
#12 = Fieldref #1.#13     // com/bjpowernode/test/TestInt.a:I
#13 = NameAndType #5:#6   // a:I

// 字節碼
4: getfield #12  // Field a:I

Fieldref 引用鏈路圖

鏈路:`getfield #12` → `Fieldref(#1, #13)` → `Class(#2)` + `NameAndType(#5, #6)` → `Utf8` 字符串。

10. CONSTANT_Methodref_info - 方法符號引用(類方法)

  • tag = 10
  • 結構同 Fieldref:`class_index` + `name_and_type_index`
  • **不包含接口方法**

實戰驗證

public class Programer {
    Computer computer;
    public void doWork() { computer.calculate(); }
}
public class Computer {
    public void calculate() { System.out.println("working..."); }
}

反編譯:

#12 = Utf8 ()V
#20 = Methodref #21.#23  // com/bjpowernode/test/Computer.calculate:()V
#21 = Class #22          // com/bjpowernode/test/Computer
#22 = Utf8 com/bjpowernode/test/Computer
#23 = NameAndType #24:#12 // calculate:()V
#24 = Utf8 calculate

// 字節碼
4: invokevirtual #20  // Method Computer.calculate:()V

Methodref 引用鏈路圖

11. CONSTANT_InterfaceMethodref_info - 接口方法符號引用

  • tag = 11
  • 專用於接口方法引用,結構同 Methodref
  • 字節碼指令:`invokeinterface`

實戰驗證

public class Plane {
    IFlyable flyable;
    void flyToSky() { flyable.fly(); }
}
public interface IFlyable { void fly(); }

反編譯:

#8 = Utf8 ()V
#19 = InterfaceMethodref #20.#22 // com/bjpowernode/test/IFlyable.fly:()V
#20 = Class #21                // com/bjpowernode/test/IFlyable
#21 = Utf8 com/bjpowernode/test/IFlyable
#22 = NameAndType #23:#8       // fly:()V
#23 = Utf8 fly

// 字節碼
4: invokeinterface #19, 1  // InterfaceMethod IFlyable.fly:()V

InterfaceMethodref 引用鏈路圖

常量池總結表

Tag類型用途核心索引
1CONSTANT_Utf8_infoUTF-8 字符串-
3CONSTANT_Integer_infoint 常量-
4CONSTANT_Float_infofloat 常量-
5CONSTANT_Long_infolong 常量(佔2槽)-
6CONSTANT_Double_infodouble 常量(佔2槽)-
7CONSTANT_Class_info類/接口符號引用name_index → Utf8
8CONSTANT_String_info字符串字面量string_index → Utf8
9CONSTANT_Fieldref_info字段符號引用class_index + name_and_type_index
10CONSTANT_Methodref_info類方法符號引用class_index + name_and_type_index
11CONSTANT_InterfaceMethodref_info接口方法符號引用class_index + name_and_type_index
12CONSTANT_NameAndType_info名稱+描述符name_index + descriptor_index → Utf8

核心洞察

  1. 符號引用三元組:Fieldref/Methodref/InterfaceMethodref = Class_info + NameAndType_info
  2. NameAndType 復用:同名同描述符的字段/方法共享一個 NameAndType 項
  3. 索引鏈路:字節碼指令 → 常量池索引 → 多層級引用 → 最终落地 Utf8 字符串
  4. 編譯期確定:所有符號引用在編譯期生成,運行期由 JVM 解析為直接引用

下篇將解析常量池之後的結構:類信息、父類、接口、字段表、方法表、屬性表。

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