文章首发于【Java天堂】,跟随我探索Java进阶之路!
Class文件是什么
Java Class文件是Java编译器将源代码编译后的二进制表示,它是Java虚拟机(JVM)运行的基础。
Class文件绝大部分内容是在1997年发布的第一版《Java虚拟机规范》中就已经定义好的,后续20多年的发展过程当中Java经历了大大小小无数个版本的迭代,加入了很多新的特性,但Class文件的整体结构没什么大的变化,除了支持一些新的特性来扩展内容以外,其他内容在这20多年的时间当中基本上没有变化,这样的设计对于Java语言本身的兼容性和稳定性是大有好处的,不管上层的语言特性如何变化,最终的Class文件变化不大,Java虚拟机只需要按照Class的文件标准来执行就好了。
Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前[插图]的方式分割成若干个8个字节进行存储
文件格式
Java Class 文件采用了一种标准的二进制格式,它由多个部分组成,每个部分都有特定的作用。下面是 Java Class 文件的基本格式:
魔数(Magic Number)
: Java Class 文件的前4个字节是一个固定的魔数,用于识别文件是否为有效的 Java Class 文件。魔数的值为0xCAFEBABE。版本信息(Version)
: 之后的4个字节分别表示 Java 版本号。前两个字节表示主版本号,后两个字节表示次版本号。例如,Java 8 的版本号为52.0。常量池(Constant Pool)
: 常量池是 Java Class 文件的一个重要组成部分,它包含了类中使用的常量,如字符串、类名、方法名等。常量池的第一个常量是一个占位符,后续的常- 量都从1开始计数。访问标志(Access Flags)
: 访问标志用于描述类或者类的成员的访问级别,如 public、private、protected 等。类信息(Class Information)
: 包括类的名称、父类名称、接口列表等。字段表(Field Table)
: 字段表用于存储类的成员变量信息,包括字段名、类型等。方法表(Method Table)
: 方法表存储了类的方法信息,包括方法名、参数列表、返回类型等。属性表(Attribute Table)
: 属性表用于存储额外的信息,如代码行号、异常表、注解等。
示例代码
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
编译HelloWorld.java文件可以得到HelloWorld.class文件
javac HelloWorld.java
因为.class文件是编译后的二进制文件,需要使用特定的工具,才能看到对应的内容。可以使用winhex这个工具打开文件,如下图所示
可以看到前面8个字节,分别表示魔数、Class文件的版本号。后面依次是常量池、访问标志、类信息、字段表、方法表、属性表
如果有兴趣,可以详细研究一下各个部分的内容和存储方式,对于理解整个Java文件运行的过程可以起到一个整体的认识
标签:文件,Java,字节,版本号,这篇,Class,常量 From: https://www.cnblogs.com/pzjtian/p/18181176本文由博客一文多发平台 OpenWrite 发布!