主题
面试速答(先看这里)
**一句话结论:**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文件的常量池入口处会设置两个字节的常量池容量计数器,记录了常量池中常量的个数。

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

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