如何利用常量池Constant_Pool理解字节码文件中的字面量

风萱君_2184

风萱君_2184

2026-04-08

358人浏览

原创

常量池是.class文件中存储字面量和符号引用的核心结构,包括字符串、数字、类/方法/字段名及描述符等,均以constant_utf8_info等形式存放,指令通过索引引用,实现空间节省、动态链接与jvm验证优化。

如何利用常量池constant_pool理解字节码文件中的字面量

常量池(Constant Pool)是 Java 字节码文件(.class)中最关键的数据结构之一,它集中存储了类或接口中所有**字面量(literal)和符号引用(symbolic references)**。理解常量池,是读懂字节码、分析编译行为、排查运行时异常(如 NoClassDefFoundError、IllegalAccessError)的基础。

常量池里存的“字面量”有哪些?

Java 中的“字面量”在字节码层面并不直接嵌入指令流,而是统一登记在常量池中,指令通过索引引用它们。常见类型包括:

  • 字符串字面量:如 "hello"、"123",对应 CONSTANT_String_info,实际指向一个 CONSTANT_Utf8_info
  • 数字字面量:整型(int/byte/short/char)用 CONSTANT_Integer_info;浮点型用 CONSTANT_Float_info 或 CONSTANT_Double_info;long 和 double 占两个连续槽位
  • 类/接口/字段/方法名:全都是 CONSTANT_Utf8_info 形式存储的 UTF-8 编码字符串,例如 "java/lang/Object"、"toString"、"()Ljava/lang/String;"
  • 类描述符、方法签名、字段描述符:也以 CONSTANT_Utf8_info 存储,是 JVM 解析类型和调用的关键依据

为什么不能把字面量直接写进指令?

这是字节码设计的精巧之处:

  • 节省空间:同一个字符串(如 "name")在代码中多次出现,只在常量池存一份,多条指令共用一个索引
  • 支持动态链接:方法调用指令(如 invokevirtual)不硬编码目标地址,而是引用常量池中的 CONSTANT_Methodref_info,该结构又分别指向类名、方法名和描述符——这些都可后期解析、验证、甚至被 Java Agent 修改
  • 便于验证与优化:JVM 加载类时先校验常量池的完整性(比如符号引用是否格式合法、类是否存在),再进行链接;即时编译器也可基于常量池信息做常量折叠、内联等优化

怎么查看和分析常量池?

使用 JDK 自带工具即可直观观察:

  • javap -v MyClass.class:输出详细字节码,Constant pool: 段落列出全部常量项,每行带编号(从 #1 开始),并标注类型(如 #16 = String #18 表示 #16 是字符串,其值由 #18 给出)
  • 关注索引间的引用关系:例如 CONSTANT_Methodref_info 总是包含两个索引——指向类符号(CONSTANT_Class_info)和名称及类型描述符(CONSTANT_NameAndType_info),后者又分别指向 CONSTANT_Utf8_info
  • 注意特殊规则:常量池索引从 1 开始;CONSTANT_Long_info 和 CONSTANT_Double_info 各占两个位置,后续项索引自动跳过(如 #5 是 long,则 #6 无效,下一个是 #7)

实战小例子:看懂一句 String s = "abc";

编译后,该语句通常对应字节码:ldc #2(加载常量池第 2 项)。用 javap -v 查看常量池可见:

#2 = String #4
#4 = Utf8 abc

这说明:字符串字面量 "abc" 作为 UTF-8 字节序列存于 #4;#2 是一个字符串引用项,指向 #4。JVM 执行 ldc 时,会根据 #2 定位到 #4 的内容,然后在堆中创建或复用对应的 String 实例(受字符串池影响)。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10697

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7822

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6812

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2809

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20111

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1235

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习