java类的结构_Java类文件结构

Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式锁关联。不管是Java代码编译为存储字节码的Class文件,还是使用JRuby等其他语言的编译器将程序代码编译为Class文件,虚拟机都可以加载。

Java中Class类文件结构如下图所示:

Java类文件中的魔数与Class文件的版本

每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。

紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6字节是次版本号(Minor Version),第7和第8个字节是主版本号(Major Version)。

例如 CAFEBABE00000032,其中0xCAFEBABE是魔数,次版本号的0x0000,主版本号是0x0032,也就是十进制的50.

Java类文件中的常量池

紧接着主次版本号之后的是常量池入口,常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一。

常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据代表常量池容量计数值(constantpoolcount)。这里的容量计数是从1而不是0开始的。例如 CAFEBABE000000320016,其中0x0016(十进制22),这就代表常量池中有21项常量(索引值为1-21)。设计者将0项常量空出来是为了:在表达“不引用任何一个常量池项目”的含义,这种情况就可以把索引值置为0来表示。

常量池中主要存放两大类常量:字面量和符号引用。字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括了下面三类常量:

类和接口全限定名

字段的名称和描述符

方法的名称和描述符

常量池中的数据项的类型如下表:

可以使用Javap命令输出常量表:

javap -verbose TestClass.class

为什么Java中方法、字段名有最大值的限制?

每个方法、字段都需要在常量池中引用CONSTANTUtf8info型常量来描述名称,而常量池的最大值就是(0xffff,常量池容量计数值是u2类型的,2个字节),为65535(16^4-1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值