首页 > 代码库 > Class文件中的常量
Class文件中的常量
NO0.常量池计数器
常量池是class文件中非常重要的结构,它描述着整个class文件的字面量信息。 常量池是由一组constant_pool结构体数组组成的,而数组的大小则由常量池计数器指定。常量池计数器constant_pool_count 的值 =constant_pool表中的成员数+ 1。constant_pool表的索引值只有在大于 0 且小于constant_pool_count时才会被认为是有效的。
NO0.常量池数据区
常量池,constant_pool是一种表结构,它包含 Class 文件结构及其子结构中引用的所有字符串常量、 类或接口名、字段名和其它常量。 常量池中的每一项都具备相同的格式特征——第一个字节作为类型标记用于识别该项是哪种类型的常量,称为 “tag byte” 。常量池的索引范围是 1 至constant_pool_count?1。常量池的具体细节我们会稍后讨论。
NO1.常量池在class文件的什么位置?
NO2.常量池的里面是怎么组织的?
常量池的组织很简单,前端的两个字节占有的位置叫做常量池计数器(constant_pool_count),它记录着常量池的组成元素常量池项(cp_info)的个数。紧接着会排列着constant_pool_count-1个常量池项(cp_info)。如下图所示:
NO3.常量池项 (cp_info) 的结构是什么?
每个常量池项(cp_info) 都会对应记录着class文件中的某中类型的字面量。让我们先来了解一下常量池项(cp_info)的结构吧:
JVM虚拟机规定了不同的tag值和不同类型的字面量对应关系如下:
所以根据cp_info中的tag 不同的值,可以将cp_info 更细化为以下结构体:
CONSTANT_Utf8_info,CONSTANT_Integer_info,
CONSTANT_Float_info,CONSTANT_Long_info,
CONSTANT_Double_info,CONSTANT_Class_info,
CONSTANT_String_info,CONSTANT_Fieldref_info,
CONSTANT_Methodref_info,CONSTANT_InterfaceMethodref_info,
CONSTANT_NameAndType_info,CONSTANT_MethodHandle_info,
CONSTANT_MethodType_info,CONSTANT_InvokeDynamic_info。
现在让我们看一下细化了的常量池的结构会是类似下图所示的样子:
NO4.常量池能够表示那些信息?
本文源自 http://blog.csdn.NET/luanlouis/
Class文件中的常量