是的,Java 中每个 .class
文件都是唯一的,这是由 Java 虚拟机的工作机制决定的。
关于 .class
文件包含的内容:
-
魔数:
.class
文件的前 4 个字节称为魔数,用于标识这个文件是一个 class 文件。它的固定值为0xCAFEBABE
。
-
版本号:
- 紧接着魔数的 4 个字节分别是次版本号和主版本号,用于标识 class 文件的版本。
-
常量池:
- 常量池是 class 文件结构中第三部分,它是一种类似于符号表的数据结构,用于存放编译器generations,如字面量、方法/字段的引用等。
-
访问标志:
- 用于识别一些相关的访问信息,如是类还是接口、是否为 public、是否为 abstract 等。
-
类索引、父类索引、接口索引:
- 这些索引都指向常量池,用于确定这个类的继承关系。
-
字段表集合:
- 描述接口或类中声明的变量。
-
方法表集合:
- 描述类中定义的方法。
-
属性表集合:
- 用于存储一些额外的信息,如行号、局部变量表、异常处理表等。
每个 .class
文件都对应着一个 Java 类或接口的定义,这些信息最终会被 Java 虚拟机所使用,从而完成类的加载、链接和初始化。Java 虚拟机对 .class
文件的格式有严格的规范,这确保了 Java 程序的跨平台性。