Class类文件中的常量池,是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是Class文件中第一个出现的表类型数据项目。
先回顾一下Class类文件的结构定义:
ClassFile
{
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
这里要列举的就是Class文件结构中的cp_info,即常量池中的各常量项的结构表
常量 | 项目 | 类型 | 描述 |
---|
`CONSTANT_Class_info` {
u1 tag; // 值为1
u2 name_index; // 指向权限定名常量项的索引
}
`CONSTANT_Fieldref_info` {
u1 tag; // 值为9
u2 class_index; // 指向声明字段的类或接口描述符CONSTANT_Class_info的索引项
u2 name_and_type_index; // 指向字段描述符CONSTANT_NameAndType的索引项
}
`CONSTANT_Methodref_info` {
u1 tag; // 值为10
u2 class_index; // 指向声明方法的类描述符CONSTANT_Class_info的索引项
u2 name_and_type_index; // 指向名称及类型描述符CONSTANT_NameAndType的索引项
}
`CONSTANT_InterfaceMethodref_info` {
u1 tag; // 值为11
u2 class_index; // 指向声明方法的接口描述符CONSTANT_Class_info的索引项
u2 name_and_type_index; // 指向名称及类型描述符CONSTANT_NameAndType的索引项
}
`CONSTANT_String_info` {
u1 tag; // 值为8
u2 string_index; // 指向字符串字面量的索引
}
`CONSTANT_Integer_info` {
u1 tag; // 值为3
u4 bytes; // 按照高位在前存储的int值
}
`CONSTANT_Float_info` {
u1 tag; // 值为4
u4 bytes; // 按照高位在前存储的float值
}
`CONSTANT_Long_info` {
u1 tag; // 值为5
u4 high_bytes; // 按照高位在前存储的long值
u4 low_bytes; //
}
`CONSTANT_Double_info` {
u1 tag; // 值为6
u4 high_bytes; // 按照高位在前存储的double值
u4 low_bytes; //
}
`CONSTANT_NameAndType_info` {
u1 tag; // 值为12
u2 name_index; // 指向该字段或方法名称常量项的索引
u2 descriptor_index; // 指向该字段或方法描述符常量项的索引
}
`CONSTANT_Utf8_info` {
u1 tag; // 值为1
u2 length; // UTF8编码的字符串占用的字节数
u1 bytes[length]; // 长度为length的UTF8编码的字符串
}
`CONSTANT_MethodHandle_info` {
u1 tag; // 值为15
u1 reference_kind; // 值必须在[1~9]之间,它决定了方法句柄的类型。
//方法句柄类型的值表示方法句柄的字节码行为
u2 reference_index; // 值必须是对常量池的有效索引
}
`CONSTANT_MethodType_info` {
u1 tag; // 值为16
u2 descriptor_index; // 值必须是对常量池的有效索引,
//常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示方法的描述符
}
`CONSTANT_InvokeDynamic_info` {
u1 tag; // 值为18
u2 bootstrap_method_attr_index; // 值必须是对当前Class文件中引导方法表的
//bootstrap_methods[]数组的有效索引
u2 name_and_type_index; // 值必须是对当前常量池的有效索引,常量池在该索引处的项必须
// 是CONSTANT_NameAndType_info结构,表示方法名和方法描述符
}
`CONSTANT_Module_info` {
u1 tag; //
u2 name_index; //
}
`CONSTANT_Package_info` {
u1 tag; //
u2 name_index; //
}