Java常量池及域详解

本文针对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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值