java中jvm中的常量池_JVM常量池中的数据结构

本文详细介绍了Java中JVM的常量池结构,包括不同类型的常量及其对应的16进制标识,如CONSTANT_Class, CONSTANT_String等,并解析了如CONSTANT_MethodHandle_info等复杂数据结构。此外,还提及了自Java 5.0起引入的MethodHandle和MethodType常量。" 90732477,8496191,正则表达式预查详解:正反向预查实战,"['正则表达式', 'php']
摘要由CSDN通过智能技术生成

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值