常量池(constant_pool[])
表
1字节的tag
不同的tag对应着后续不同的数据长度
2~N个字节
<1byte>tag <2~N>data
常量池数据结构类型
type
数值
16进制
Class版本
JavaSE版本
CONSTANT_Class
7
0x07
45.3
1.0.2
CONSTANT_Fieldref
9
0x09
45.3
1.0.2
CONSTANT_Methodref
10
0x0a
45.3
1.0.2
CONSTANT_InterfaceMethodref
11
0x0b
45.3
1.0.2
CONSTANT_String
8
0x08
45.3
1.0.2
CONSTANT_Integer
3
0x03
45.3
1.0.2
CONSTANT_Float
4
0x04
45.3
1.0.2
CONSTANT_Long
5
0x05
45.3
1.0.2
CONSTANT_Double
6
0x06
45.3
1.0.2
CONSTANT_NameAndType
12
0x0c
45.3
1.0.2
CONSTANT_Utf8
1
0x01
45.3
1.0.2
CONSTANT_MethodHandle
15
0x0f
51.0
7
CONSTANT_MethodType
16
0x10
51.0
7
CONSTANT_InvokeDynamic
18
0x12
51.0
7
CONSTANT_Module
19
0x13
53.0
9
CONSTANT_Package
20
0x14
53.0
9
数据结构
CONSTANT_Class_info
CONSTANT_Class_info {
u1 tag;
u2 name_index; //CONSTANT_Utf8_info
}
CONSTANT_Fieldref_info
CONSTANT_Fieldref_info {
u1 tag;
u2 class_index; //CONSTANT_Class_info
u2 name_and_type_index; //CONSTANT_NameAndType_info
}
CONSTANT_Methodref_info
CONSTANT_Methodref_info {
u1 tag;
u2 class_index; //CONSTANT_Class_info
u2 name_and_type_index; //CONSTANT_NameAndType_info
}
CONSTANT_InterfaceMethodref_info
CONSTANT_InterfaceMethodref_info {
u1 tag;
u2 class_index; //CONSTANT_Class_info
u2 name_and_type_index; //CONSTANT_NameAndType_info
}
CONSTANT_String_info
CONSTANT_String_info {
u1 tag;
u2 string_index; //CONSTANT_Utf8_info
}
CONSTANT_Integer_info
CONSTANT_Integer_info {
u1 tag;
u4 bytes; //直接数
}
CONSTANT_Float_info
CONSTANT_Float_info {
u1 tag;
u4 bytes; //直接数
}
CONSTANT_Long_info
CONSTANT_Long_info {
u1 tag;
u4 high_bytes; //直接数
u4 low_bytes; //直接数
}
CONSTANT_Double_info
CONSTANT_Double_info {
u1 tag;
u4 high_bytes; //直接数
u4 low_bytes; //直接数
}
CONSTANT_NameAndType_info
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index; //CONSTANT_Utf8_info
u2 descriptor_index; //CONSTANT_Utf8_info
}
CONSTANT_Utf8_info
CONSTANT_Utf8_info {
u1 tag;
u2 length; //直接数
u1 bytes[length]; //改进版的UTF8
}
与标准UTF8不同的地方:
null字符使用2字节格式,而不是标准的1字节
避免内嵌null时分隔问题
JVM仅使用1/2/3字节的UTF8,不使用标准中4字节格式
使用2个3字节UTF8来表示
字符串结尾不会追加null终止符
紧凑
CONSTANT_MethodHandle_info
CONSTANT_MethodHandle_info {
u1 tag; //15
u1 reference_kind; //1~9
u2 reference_index; //取决于kind
}
kind
说明
index
版本
1
REF_getField
CONSTANT_Fieldref_info
2
REF_getStatic
CONSTANT_Fieldref_info
3
REF_putField
CONSTANT_Fieldref_info
4
REF_putStatic
CONSTANT_Fieldref_info
5
REF_invokeVirtual
CONSTANT_Methodref_info
8
REF_newInvokeSpecial
CONSTANT_Methodref_info
6
REF_invokeStatic
CONSTANT_Methodref_info
52.0-
6
REF_invokeStatic
CONSTANT_Methodref_info
52.0-
7
REF_invokeSpecial
CONSTANT_Methodref_info / CONSTANT_InterfaceMethodref_info
52.0+
7
REF_invokeSpecial
CONSTANT_Methodref_info / CONSTANT_InterfaceMethodref_info
52.0+
9
REF_invokeInterface
CONSTANT_InterfaceMethodref_info
CONSTANT_MethodType_info
CONSTANT_MethodType_info {
u1 tag; //16
u2 descriptor_index; //CONSTANT_Utf8_info
}
CONSTANT_InvokeDynamic_info
CONSTANT_InvokeDynamic_info {
u1 tag; //18
u2 bootstrap_method_attr_index; //index
into the bootstrap_methods array of the bootstrap method table
u2 name_and_type_index; //CONSTANT_NameAndType_info
}
CONSTANT_Module_info
CONSTANT_Module_info {
u1 tag; //19
u2 name_index; //CONSTANT_Utf8_info
}
CONSTANT_Package_info
CONSTANT_Package_info {
u1 tag; //20
u2 name_index; //CONSTANT_Utf8_info
}