参考答案
一、class文件
Class 文件包含了 Java 虚拟机的指令集、符号表、辅助信息的字节码(Byte Code),是实现跨操作系统和语言无关性的基石之一。
一个 Class 文件定义了一个类或接口的信息,是以 8 个字节为单位,没有分隔符,按顺序紧凑排在一起的二进制流。
二、class文件用 “无符号数” 和 “表” 组成的伪结构来存储数据
- 无符号数:基本数据类型,用来描述数字、索引引用、数量值、字符串值,如u1、u2 分别表示 1 个字节、2 个字节。
- 表:无符号数和其他表组成,命名一般以 “_info” 结尾。
三、class文件的组成部分
1. 魔数 Magic Number
- Class 文件头 4 个字节,0xCAFEBABE。
- 作用是确定该文件是 Class 文件。
2. 版本号
- 4 个字节,前 2 个是次版本号 Minor Version,后 2 个主版本号 Major Version。
- 从 45 (JDK1.0) 开始,如 0x00000032 转十进制就是 50,代表 JDK 6。
- 低版本的虚拟机跑不了高版本的 Class 文件。
3. 常量池
- 常量容量计数值(constant_pool_count),u2,从 1 开始。如 0x0016 十进制 22 代表有 21 项常量。
- 每项常量都是一个表,目前 17 种。
- 特点:Class 文件中最大数据项目之一、第一个出现表数据结构。
4. 访问标志
- 2 个字节,表示类或接口的访问标志。
5. 类索引、父类索引、接口索引集合
- 类索引(this_class)、父类索引(super_class),u2。
- 接口索引集合(interfaces),u2 集合。
- 类索引确定类的全限定名、父类索引确定父类的全限定名、接口索引集合确定实现接口。
- 索引值在常量池中查找对应的常量。
6. 字段表(field_info)集合
- 描述接口或类申明的变量。
- fields_count,u2,表示字段表数量;后面接着相应数量的字段表。
- 9 种字段访问标志。
7. 方法表(method_info)集合
- 描述接口或类申明的方法。
- methods_count,u2,表示方法表数量;后面接着相应数量的方法表。
- 12 种方法访问标志。
- 方法表结构与字段表结构一致。
8. 属性表(attribute_info)集合
- class 文件、字段表、方法表可携带属性集合,描述特有信息。
- 预定义 29 项属性,可自定义写入不重名属性。
以上,是JVM面试题【class文件的结构是怎样的】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—