微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2EE >

JVM探索之路之Class文件结构解析(二):常量池

时间:2017-01-09 04:01  浏览:努力统计中...
JVM 学习笔记目录: JVM探索之路之Class文件结构解析(一) :Class文件的格式与定义 JVM探索之路之Class文件结构解析(三):访问修饰符、类索引、父类索引与接口索引集合 常量池 上一

 

JVM 学习笔记目录:

JVM探索之路之Class文件结构解析(一) :Class文件的格式与定义 

JVM探索之路之Class文件结构解析(三):访问修饰符、类索引、父类索引与接口索引集合 

 

常量池

  上一篇博文介绍了Class文件的“魔数”和“主次版本号”,常量池数据项目的入口是紧接着“主次版本号”数据项目的。Class文件的常量池是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时也是Class文件中第一个表类型的数据项目。为了方面讲解和查看下面给出Class文件结构表和实例Class文件:

示例Class:

package com.beliefbetrayal.clazz;

public class ClassFileTest {

private int m;

public int getM() {
return m;
}

public void setM(int m) {
this.m = m;
}
}

  无论是无符号数还是表类型,当需要描述同一类型但数量不定的多个数据时。经常会使用一个前置的容量计数器加上若干个连续的数据项形式。因为Class的常量池中的常量是不固定的,所以常量池的入口需要前置一个容量计数器“contant_pool_count”用于记录常量池中常量的数目,它是u2(2个字节)类型的。 用WinHex打开该Class文件获得下图:

 图为Class文件的部分信息1

  该常量池的容量计数器的索引是从1开始的而不是从0开始,将0索引空出来时为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量”的意思。因为量池的容量计数器为u2,所以它的值为"0x0018",换算成10进制数为24,代表了常量池中有23个常量索引为1~23。为了验证准确性,我们可以使用JDK为我们提供的javap工具,下图为使用javap分析Class文件的部分截图(只列出了常量池部分):

  可也从图中的信息看出,该Class文件确实有23个常量。下面来具体分析常量池,常量池之中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic Reference)。字面量一般为“文本字符串”、“被声明为final的常量值”等等。符号引用一般为“类和接口的全限定名(Fully Qualified Name)”、“字段的名称和描述符(Descriptor)”和“方法的名称和描述符”。

 

  常量池中的每一项常量都是一个表类型,在JDK6.0之前有11种结构的表数据,这11种表都有一个共同的特点,就是表开始的第一位是一个u1类型的标志位(tag,取值为1~12,标志2空缺),它代表了当前这个常量属于那种常量类型,11种常量类型所代表的具体含义如下图所示:

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------
栏目列表
推荐内容