首页 > 代码库 > 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文件中的常量