本文针对ClassFile中的constant_pool及fields字段展开表述
一、constant_pool
虚拟机规范对其描述:java程序在虚拟机运行时,虚拟机指令并不依赖于类、接口、实例或数组的运行时布局,而是依赖于constant_pool中的符号信息。
也就是说,java程序在运行的时候,是根据常量池中的各种符号信息来生成对应的指令。这里我是这么理解的,后续再深入JVM时,如果有问题,我再修改。
常量池表包含的条目内容
cp_info {
u1 tag;
u1 info[];
}
tag标识不同的常量池条目类型
info是和tag类型对应的数组,存放ClassFile中同tag类型的字面量信息
然后我们看看具体的常量池都存在哪些info
TagName Value
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18
然后看对应的info具体是什么内容,以CONSTANT_Class为例
CONSTANT_Class_info {
u1 tag;
u2 name_index;
}
表示这是个类或者接口信息,其名字在常量池中的索引为name_index。也就是说在name_index索引位置,存放了类的名称信息。该位置上放着一个CONSTANT_Utf8_info结构信息,代表一个有效的编码后的二进制类或者接口的名字。
那我们接着看看CONSTANT_Utf8_info
CONSTANT_Utf8_info {
u1 tag;
u2 length;