首页 > 编程语言 >如果你还不了解 Java Class 文件结构,来看看这篇吧

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

时间:2024-05-08 23:45:45浏览次数:23  
标签:文件 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这个工具打开文件,如下图所示

pkVt44U.png

可以看到前面8个字节,分别表示魔数、Class文件的版本号。后面依次是常量池、访问标志、类信息、字段表、方法表、属性表

如果有兴趣,可以详细研究一下各个部分的内容和存储方式,对于理解整个Java文件运行的过程可以起到一个整体的认识

本文由博客一文多发平台 OpenWrite 发布!

标签:文件,Java,字节,版本号,这篇,Class,常量
From: https://www.cnblogs.com/pzjtian/p/18181176

相关文章

  • 编程:java 发送email程序:通用版本:借鉴“蚂蚁小哥 <[email protected]>”的文章
     1packagecom.alibaba.otter.canal.adapter.launcher.loader;23importjava.text.SimpleDateFormat;4importjava.util.*;5importjavax.mail.*;6importjavax.mail.internet.*;78publicclassJavaxJavaMailClient{910private......
  • 类加载器(ClassLoader)
    类加载器(ClassLoader)类加载、编译类加载器用于将Java类(此时的Java类指的是已经从.java编译成.class的字节码文件)通过JVM加载到内存中才能运行。编译java文件包名为:packagecom.melody.sec.classloader;、类名称为:DefineClassDemo编译java文件javaccom/melody/sec/class......
  • Java ThreadLocal 类的使用
    基于Java-ThreadLocal类的使用整理ThreadLocal表示线程的局部变量,当前线程可以通过set/get来对这个局部变量进行操作,其他线程不能对其进行访问ThreadLocal支持泛型,也就是支持指定value类型,像是ThreadLocal<Date>就是指定value为Date类型。每个线程会有一......
  • [Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。
    前言最近在开发一个组件,但是这个东西是以dll的形式发布的界面库,所以在开发的时候就需要上层调用。如果你是很懂CMake的话,ui_xx.h的文件目录在$下然后除了有关这个ui_xx.h,还有一些别的可以简单聊聊的一、父子工程组织,或者说依赖关系在使用CMake进行开发的时候,一般可以有......
  • Java容器化改造
    dockerjava项目容器化改造前后端分离项目前端https://gitee.com/yuco/eladmin-web.git后端https://gitee.com/yuco/eladmin.git要素:vuenpmspringbootmysqlredisjava后端容器化思路:了解在物理机虚拟机的部署流程,然后编写dockerfile进行容器化部署。java项目,使用mv......
  • Selenium4自动化测试2--元素定位By.ID,By.CLASS_NAME,By.TAG_NAME
    三、元素定位方式1-通过id定位,By.IDid属性在HTML中是唯一的,因此使用id定位可以确保找到页面上唯一的元素。由于id是唯一的,浏览器在查找元素时可以快速定位到目标元素,提高了定位的效率。 importtime#pipinstallseleniumfromseleniumimportwebdriverfromselenium......
  • 对接诺诺电子发票(Java)
    沙箱环境:url:https://sandbox.nuonuocs.cn/open/v1/servicesappKey:SD63236305appSecret:SDDED2523BED4643下载诺诺的SDK:SDK下载引入项目: 服务实现层代码://创建发票信息表@OverridepublicInvoiceDtocreate(Invoiceresources){resources.setId(snowflake.......
  • Java护照识别接口开发示例、文字识别、证件识别
    护照是我们出国旅行时所必要的证件之一,他是我国公民去外国的旅行和工作的时候所代表的一个合法的身份证件。在护照上面也有不少关于我们个人身份的信息,而手动去录入如此多的身份信息这绝对是灾难。不仅证件,有的场景还需要录入很多文字信息。翔云API可识别图片上的身份证、护......
  • Java实名认证API、婚恋网实名认证
    中国网络婚恋交友行业发展近20年,电脑端网络婚恋服务已经较为成熟,商业模式也较为完善。但随着移动互联网的快速发展,移动端成为婚恋交友企业核心用户新的来源渠道。网络婚恋交友移动端人群覆盖规模逐渐超过电脑端人群,标志着以移动端为主导的婚恋交友服务正式来临,整体行业迎来了......
  • javaScript之局部变量,全局变量与局部作用域,全局作用域
    前端开发工作者,最需要学习的一门语言就是JavaScript了吧,其实学习大部分编程语言都是从基本的语法知识开始人门的。什么语句、变量、数据类型、对象、函数...今天本文就简单说明javaScript变量中的一个小小的知识点,其实在后面的最开始工作编程中我也是常常容易出现bug的一个点。......