常量池(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
}