从零开始的JVM学习--类文件结构详解
2023-12-11 22:38:22
类文件结构
“字节码”(即扩展名为 .class 的文件) 是 JVM(Java虚拟机)可以理解的代码。字节码是一种跨平台的中间语言,不面向任何特定的处理器,只面向虚拟机。通过「字节码」的方式,在一定程度上解决了传统解释型语言执行效率低的问题。
类文件 是 Java 虚拟机能够识别的二进制文件格式,它由字节码、常量池、类元数据等信息组成。类文件结构如下图所示:
1. 魔数 (Magic Number)
魔数是一个 4 字节的整数,用于标识文件类型。类文件的魔数是 0xCAFEBABE,表示一个 Java 类文件。
2. 版本号 (Version Number)
版本号是一个 4 字节的整数,用于指示类文件的版本。类文件的版本号由两部分组成:主版本号和次版本号。
主版本号表示类文件的 major version,它指定了类文件格式的重大变化。例如,Java 8 的类文件格式的主版本号是 52。次版本号表示类文件的 minor version,它指定了类文件格式的次要变化。例如,Java 8 的类文件格式的次版本号是 0。
3. 常量池 (Constant Pool)
常量池是一个表,它包含了类文件中用到的各种常量,例如:字符串常量、数字常量、类名常量、方法名常量等。常量池中的常量按照它们的类型存储在不同的表中,例如:字符串常量存储在字符串常量表中,数字常量存储在数字常量表中,类名常量存储在类名常量表中,方法名常量存储在方法名常量表中。
4. 访问标志 (Access Flags)
访问标志是一个 2 字节的整数,它用于指示类的访问权限。类的访问权限可以是 public、protected、private 等。
5. 类索引 (Class Index)
类索引是一个 2 字节的整数,它指向类名常量表中的一个常量,该常量表示类的名字。
6. 父类索引 (Super Class Index)
父类索引是一个 2 字节的整数,它指向类名常量表中的一个常量,该常量表示类的父类。
7. 接口索引 (Interfaces Index)
接口索引是一个 2 字节的整数,它指向一个表,该表中包含了类实现的所有接口的索引。
8. 字段表 (Fields Table)
字段表是一个表,它包含了类中定义的所有字段。字段表中的每个字段都包含了字段的名称、类型、访问权限等信息。
9. 方法表 (Methods Table)
方法表是一个表,它包含了类中定义的所有方法。方法表中的每个方法都包含了方法的名称、参数、返回类型、访问权限等信息。
10. 属性表 (Attributes Table)
属性表是一个表,它包含了类中定义的所有属性。属性表中的每个属性都包含了属性的名称、值等信息。