Skip to content

面试速答(先看这里)

**一句话结论:**Class常量池可以理解为是Class文件中的资源仓库。

60秒标准回答:

Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)

Class是用来保存常量的一个媒介场所,并且是一个中间场所。 Class文件中的常量池部分的内容,会在运行期加载到常量池中去

由于不同的Class文件中包含的常量的个数是不固定的,所以在Class文件的常量池入口处会设置两个字节的常量池容量计数器,记录了常量池中常量的个数

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**Class是用来保存常量的一个媒介场所,并且是一个中间场所。
  • **要点2:**由于不同的Class文件中包含的常量的个数是不固定的,所以在Class文件的常量池入口处会设置两个字节的常量池容量计数器,记录了常量池中常量的个数。
  • **要点3:**当然,还有一种比较简单的查看Class文件中常量池的方法,那就是通过 javap 命令。
  • **要点4:**从上图中可以看到,反编译后的class文件常量池中共有16个常量。
  • **要点5:**原因是与Java的语言习惯不同,常量池计数器是从1开始而不是从0开始的,常量池的个数是10进制的17,这就代表了其中有16个常量,索引值范围为1-16。

**记忆锚点:**Class → HelloWorldclass → 查看Class常量池 → References → 文件中常量池的方法 → 文件中除了包含类

关键取舍:

  • Class常量池可以理解为是Class文件中的资源仓库。

加分表达:

  • 对于以上的 HelloWorld.class ,可以通过 查看常量池内容如下: 从上图中可以看到,反编译后的class文件常量池中共有16个常量。

追问准备:

  • 围绕「Class」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「HelloWorldclass」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「查看Class常量池」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。

Class是用来保存常量的一个媒介场所,并且是一个中间场所。**Class文件中的常量池部分的内容,会在运行期加载到常量池中去。

**

扩展知识 ​

查看Class常量池 ​

由于不同的Class文件中包含的常量的个数是不固定的,所以在Class文件的常量池入口处会设置两个字节的常量池容量计数器,记录了常量池中常量的个数。

image.png

当然,还有一种比较简单的查看Class文件中常量池的方法,那就是通过javap命令。对于以上的HelloWorld.class,可以通过

c
javap -v  HelloWorld.class

查看常量池内容如下:

image.png

> 从上图中可以看到,反编译后的class文件常量池中共有16个常量。而Class文件中常量计数器的数值是0011,将该16进制数字转换成10进制的结果是17。 > > 原因是与Java的语言习惯不同,常量池计数器是从1开始而不是从0开始的,常量池的个数是10进制的17,这就代表了其中有16个常量,索引值范围为1-16。