600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java class文件中存储的数据以及文件中的常量池

java class文件中存储的数据以及文件中的常量池

时间:2023-01-31 15:03:17

相关推荐

java class文件中存储的数据以及文件中的常量池

java代码完成编译后,会在本地workspace中生成对应的class文件。每个本地class文件都包含魔数、版本号、常量池计数器、常量池数据区、访问标记、类索引、父类索引、接口计数器、接口信息数据区、字段计数器、字段信息数据区、字段计数器、字段信息数据区、方法计数器、方法信息数据区、属性计数器、属性信息数据区。可查看

学习笔记,java class文件包含哪些内容

class常量池(cp_info)

常量池中存放是的数据有如下:

数据结构如下:

tag不同的值代表不同的数据类型,如1表示字符串常量的值,3表示int常量的值。可参考下图

int和float数据类型的常量在常量池中是怎样表示和存储的

java中int和float占用4个字节,在java class文件常量池中它的tag占用1个字节,info存储占用了4个字节。

比如在test类中声明几个变量,但给变量赋值就赋10和11f

然后编译器编译成IntAndFloatTest.class字节码件,我们通过javap -v IntAndFloatTest 指令来看下其常量池中的信息,会发现只有个常量10 和个常量11f。如下图:

可以看到常量池第#8 个常量池项(cp_info) 就是CONSTANT_Integer_info,值为10;第#23个常量池项(cp_info) 就是CONSTANT_Float_info,值为11f。

就是代码中所有用到了int 类型为10 都会指向#8 个常量池项,float为11f的都指向#23个常量池项。

long和 double数据类型的常量在常量池中是怎样表示和存储的

java中long个double都是8个字节,在class字节码文件中,除了tag,8个字节分为high_bytes和low_bytes来存储。

若是某个java文件中声明了多个long和double变量,但是值都是一个的话,它们的效果跟int和float是一样的。String类型的字符串常量在常量池中是怎样表示和存储的

String类型的字符串常量在常量池中是怎样表示和存储的

字符串比较特殊,Sting、类都是引用类型,引用类型在class字节码文件中都会存储两个cp_info,必然会有一个utf8_info。String类型的是先存一个String_info,其中的string_index索引指向真正存值的utf8_info,其结构如下所示:

CONSTANT_String_info结构体中的string_index的值指向了CONSTANT_Utf8_info结构体,字符串的utf-8编码数据就在这个结构体之中。

像下面的测试类。

将Java源码编译成StringTest.class件后,在此文件的录下执 javap -v StringTest 命令,如下。

会看到是#15 的String类型指向Asciz码的具体指向#16

类件中定义的类名和类中使到的类在常量池中是怎样被组织和存储的

类文件也是引用类型。所以也是有两个cp_info,只是String用的是字面量,而类用的是类的完全限定名,然后以二进制的形式封装到CONSTANT_Class_info结构体中,然后将其放置到常量池。

举个栗子

将Java源码编译成ClassTest.class件后,在此文件的录下执 javap -v ClassTest 命令,如下。

在ClassTest.class件的常量池中,共有 3 个CONSTANT_Class_info结构体,分别表示ClassTest 中到的Class信息。 我们就看其中个表示com/jvm.ClassTest的CONSTANT_Class_info 结构体。它在常量池中的位置是#1,它的name_index值为#2,它指向了常量池的第2 个常量池项。

对于某个类,其class件中少要有两个CONSTANT_Class_info常量池项,来表示的类信息和其类信息。(除了java.lang.Object类除外,其他的任何类都会默认继承java.lang.Object)如果类声明实现了某些接,那么接的信息也会成对应的CONSTANT_Class_info常量池项。

在类中,只有真正使到了相应的类,JDK编译器才会将类的信息组成CONSTANT_Class_info常量池项放置到常量池中,如果只是声明类的变量,没有赋值的话,类信息是不会放到常量池中的。

哪些字量会进常量池中

final类型的8种基本类型的值会进常量池。

final类型(包括static的)的8种基本类型的值,只有double、float、long的值会进常量池。

常量池中包含的字符串类型字量(双引号引起来的字符串值)。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。