java中的常量池在java程序加载和链接过程中扮演着很重要的角色。
java程序中的类型由方法区中的类型数据块定义,由堆区中的相关Class实例所表示。
java程序在编译后的中间文件是class文件,与C程序编译后的*.o相比,有若干相似之处。
class文件大致可以分成2个部分,第一部分是常量池区,第二部分是代码区,将类定义中的所有函数编译成字节码。
*.o的中间文件中也有类似的分段,第一部分是常量区,第二部分是代码区,但是这里的常量区相当于常量池区中的constant_sting_info段,第二部分都是各个函数的具体编译结果。
常量池的概念有多种含义,在class文件中的常量池的概念就是constant_string_info,constant_fieldref_info的静态描述,class文件中的方法区;在运行时的常量池的概念,就是内存中的数据结构了。
在加载class文件的过程中,会完成静态的常量池的概念向运行时的常量池的概念的转变。
下面对class文件中的部分做个简单的说明
constant_string_info段 表示java源文件中的字面的字符串常量的记录集
java源文件中string具体内容在constant_utf8_info中有描述
constant_class_info段 表示java源文件中出现了所有的类的记录集
java源文件中的类的名字的具体内容在constant_utf8_info中有描述
constant_fieldref_info段 表示java源文件中的类的字段引用的记录集
字段在class文件中的表达方式包括了:字段所属类的标示以及字段引用的描述,
字段所属类的标识,也就是constant_class_info段的索引
字段引用的描述,就是在constant_nameandtype_info段中的索引
constant_methodref_info段 表示java源文件中的所有类的方法引用的记录集
方法在class文件中的表达方式包括了:方法所属类的标示以及方法引用的描述,
方法所属类的标识,也就是constant_class_info段的索引
方法引用的描述,就是在constant_nameandtype_info段中的索引
constant_nameandtype_info段 表示java源文件中的所有的符号引用,包括字段和方法等
符号引用在class文件中的表达方式随引用的不同而不同。
如果是字段的引用,就是由引用的字段名字在constant_utf8_info段中的索引和字段的类型名在constant_utf8_info段中的索引组成;
如果是方法的引用,就是由以引用的方法名在constant_utf8_info段中的索引和方法的声明类型在constant_utf8_info段中的索引组成。
constant_utf8_info段 几乎表达了java源文件中的所有具体信息
包括类的全限定名,字段引用的全限定名,字段引用的类型,方法引用的全限定名,方法的声明描述符以及常量字符串
class文件中的最后一个重要的段就是代码段也可以说是方法段。
阅读(1400) | 评论(0) | 转发(0) |