Java大厂高频面试题:你了解类文件结构吗?

Class文件是一组以8位字节为基础单位的二进制流,各个数据项严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占有8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
Class文件格式采用伪结构存储数据,这种伪结构只有两种数据类型:无符号数和表。
无符号数:属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
表:由多个无符号数或者其他表作为数据项构成的符合数据类型,所有的表都习惯以"_info"结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。

1.魔数

每个Class文件的头4个字节称为魔数,作用是确定这个文件是否为一个能被虚拟机接受的Class文件,魔数的值为:0XCAFEBABE(咖啡宝贝)。

2.Class文件的版本号

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

3.常量池

紧接着主版本号之后是常量池。常量池是占用Class文件空间最大的数据项目之一,同时它也是在Class文件中第一个出现的表类型数据项目。
由于常量池数量不固定,所以常量池入口需要放置一项u2类型的数据,表示有多少个常量,比如0x0016,即十进制的22,代表常量池中有21项常量,索引值范围是1~21,索引值0空出来。
常量池主要存放两类常量:字面量和符号引用。字面量:文本字符串、声明为final的常量值等。符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

4.访问标志

常量池结束后,紧接着两个字节代表访问标志。这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口;是否为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。

5.类索引、父类索引和接口索引

类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。

6.字段表集合

字段表用于描述接口或者类中声明的变量(不包括局部变量)。包含的变量的信息有:字段的作用域(public/private/protected修饰符)、实例变量还是类变量(static修饰符)、可变性(final)、并发可见性、是否被序列化、字段数据类型、字段名称。

7.方法表集合

方法表的结构和字段表一样,依次包括了访问标志、名称索引、描述符索引、属性表集合几项。

8.属性表集合

用于描述某些场景专有的信息。
#Java##学习路径#
全部评论
感谢参与【创作者计划2期·技术干货场】!欢迎更多牛油来写干货,瓜分总计20000元奖励!!技术干货场活动链接:https://www.nowcoder.com/link/czz2jsghtlq(参与奖马克杯将于每周五结算,敬请期待~)
点赞 回复
分享
发布于 2021-03-24 11:01

相关推荐

4 13 评论
分享
牛客网
牛客企业服务