如果你还不了解 Java Class 文件结构,来看看这篇吧

饭宝  金牌会员 | 2024-5-19 12:08:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

文章首发于【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): 属性表用于存储额外的信息,如代码行号、异常表、注解等。
示例代码
  1. public class HelloWorld {
  2.     public static void main(String[] args) {
  3.         System.out.println("Hello, World!");
  4.     }
  5. }
复制代码
编译HelloWorld.java文件可以得到HelloWorld.class文件
  1. javac HelloWorld.java
复制代码
由于.class文件是编译后的二进制文件,需要利用特定的工具,才能看到对应的内容。可以利用winhex这个工具打开文件,如下图所示

可以看到前面8个字节,分别表现魔数、Class文件的版本号。后面依次是常量池、访问标志、类信息、字段表、方法表、属性表
如果有爱好,可以具体研究一下各个部门的内容和存储方式,对于明白整个Java文件运行的过程可以起到一个整体的认识
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表