常量池表集中存储编译期确定的字面量和符号引用,包括类/接口全限定名、字段与方法的名称及描述符、复合符号引用结构体(如CONSTANT_Class_info、CONSTANT_Methodref_info等)以及字符串和基本类型字面量,为类加载、链接、验证及动态调用提供基础支撑。

常量池表是 Class 文件结构中最关键的部分,它不存储运行时数据,而是集中登记编译期已确定的**字面量和符号引用**,为后续类加载、链接与验证提供基础依据。这些信息本身不执行逻辑,但所有方法调用、字段访问、类型检查都依赖它。
类与接口的全限定名
每个类或接口的完整路径(如 java/lang/String、com/example/MyClass)都以 UTF-8 字符串形式存入常量池,类型为 CONSTANT_Utf8_info。JVM 通过这类符号识别类型归属,也是解析继承关系、包可见性、类加载委托链的起点。
字段与方法的名称和描述符
字段名(如 count)、方法名(如 toString)单独存为 UTF-8 字符串;而它们的类型签名(描述符)也独立存放:
- 字段描述符:例如 I 表示 int,Ljava/lang/String; 表示 String 引用
- 方法描述符:例如 ()V 表示无参无返回值,(I)Ljava/lang/String; 表示接收一个 int、返回 String
这些描述符不单用于类型校验,也是 invokevirtual、getfield 等指令在解析阶段定位成员的关键依据。
立即学习“Java免费学习笔记(深入)”;
符号引用结构体(非原始字符串)
真正支撑动态链接的是由多个常量池项组合而成的复合结构:
- CONSTANT_Class_info:指向一个 UTF-8 项,表示类或接口名
- CONSTANT_Fieldref_info / CONSTANT_Methodref_info:分别包含“所属类”“名称及描述符”两个索引,构成完整字段/方法引用
- CONSTANT_InterfaceMethodref_info:专用于接口方法调用(如 default 方法)
- CONSTANT_NameAndType_info:把名称和描述符绑定在一起,供上面两类引用复用
例如一条 invokestatic #5 指令,#5 实际是一个 CONSTANT_Methodref_info,它再间接引用到类名、方法名、方法描述符三个 UTF-8 项——这种间接性正是 Java 支持多态、热替换和字节码增强的基础。
字符串字面量与基本类型字面量
源码中出现的 "hello"、42、3.14f 等,不会直接嵌入指令流,而是:
- 字符串 → 存为 CONSTANT_String_info(内部指向一个 CONSTANT_Utf8_info)
- 整型(byte/short/char/int)→ CONSTANT_Integer_info
- 浮点型 → CONSTANT_Float_info 或 CONSTANT_Double_info
- long/double 占两个连续槽位(因 64 位宽度)
这种设计既节省空间(相同字符串只存一份),又便于 JVM 在验证阶段统一检查字面量合法性,比如防止非法 Unicode 或溢出数值。


















