常量池是class文件中非常重要的结构,它描述着整个class文件的字面量信息。 常量池是由一组constant_pool结构体数组组成的,而数组的大小则由常量池计数器指定。常量池计数器constant_pool_count 的值 =constant_pool表中的成员数+ 1。constant_pool表的索引值只有在大于 0 且小于constant_pool_count时才会被认为是有效的。
常量池,constant_pool是一种表结构,它包含 Class 文件结构及其子结构中引用的所有字符串常量、 类或接口名、字段名和其它常量。 常量池中的每一项都具备相同的格式特征——第一个字节作为类型标记用于识别该项是哪种类型的常量,称为 “tag byte” 。常量池的索引范围是 1 至constant_pool_count?1。常量池的具体细节我们会稍后讨论。
常量池的组织很简单,前端的两个字节占有的位置叫做常量池计数器(constant_pool_count),它记录着常量池的组成元素常量池项(cp_info)的个数。紧接着会排列着constant_pool_count-1个常量池项(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。
现在让我们看一下细化了的常量池的结构会是类似下图所示的样子:
本文源自 http://blog.csdn.NET/luanlouis/
原文:http://www.cnblogs.com/jiangyang/p/6526973.html