如果你还不了解 Java Class 文件结构,来看看这篇吧
文章首发于【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这个工具打开文件,如下图所示
https://img2024.cnblogs.com/other/2337066/202405/2337066-20240508233425106-231224712.png
可以看到前面8个字节,分别表现魔数、Class文件的版本号。后面依次是常量池、访问标志、类信息、字段表、方法表、属性表
如果有爱好,可以具体研究一下各个部门的内容和存储方式,对于明白整个Java文件运行的过程可以起到一个整体的认识
本文由博客一文多发平台 OpenWrite 发布!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]