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

JVM 類文件結構:常量池深度解析

     編輯:Java 綜合教學

JVM 類文件結構:常量池深度解析

Class 文件中常量池是「資源倉庫」,存儲字面量與符號引用,是連接各數據項的核心。本文結合十六進制分析與 javap 驗證,詳細解析常量池結構與 14 種表類型。

常量池入口

  • 緊隨主版本號之後;
  • 首兩字節 u2 constant_pool_count:容量計數(從 1 開始,0 表示不引用);
  • 實際表項數 = count - 1。

兩大類常量

  1. 字面量:接近 Java 語言層面的常量,如文本字符串、final 常量值;
  2. 符號引用:
    • 類/接口全限定名(CONSTANT_Class_info);
    • 字段符號引用(CONSTANT_Fieldref_info);
    • 方法符號引用(CONSTANT_Methodref_info);
    • 接口方法符號引用(CONSTANT_InterfaceMethodref_info);
    • 名稱與描述符(CONSTANT_NameAndType_info)。

14 種常量表類型表

類型標志描述
CONSTANT_utf8_info1UTF-8 編碼字符串
CONSTANT_Integer_info3整型字面量
CONSTANT_Float_info4浮點型字面量
CONSTANT_Long_info5長整型字面量
CONSTANT_Double_info6雙精度浮點型字面量
CONSTANT_Class_info7類/接口符號引用
CONSTANT_String_info8字符串字面量
CONSTANT_Fieldref_info9字段符號引用
CONSTANT_Methodref_info10類方法符號引用
CONSTANT_InterfaceMethodref_info11接口方法符號引用
CONSTANT_NameAndType_info12字段/方法名與描述符
CONSTANT_MethodType_info16方法類型
CONSTANT_MethodHandle_info15方法句柄
CONSTANT_InvokeDynamic_info18動態調用點

每表首字節為 u1 tag 標識類型。

實戰分析

某 Class 文件常量池計數 0x0013 = 19,即 1~18 共 18 項。首項 0x0a = 10 對應 CONSTANT_Methodref_info。使用 javap -verbose 可直接查看完整常量池表,驗證手工分析結果。

Class 文件十六進制截圖

javap 輸出常量池

關鍵點

  • CONSTANT_utf8_info 最大長度 64KB,限制 Java 標識符長度;
  • Long/Double 佔用兩個常量池槽位(歷史原因);
  • 方法、字段名稱均引用 utf8_info,實現字符串共享。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved