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

news/2024/10/3 14:26:10

文章首发于【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 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

.NET有哪些好用的定时任务调度框架

前言 定时任务调度的相关业务在日常工作开发中是一个十分常见的需求,经常有小伙伴们在技术群提问:有什么好用的定时任务调度框架推荐的?今天大姚给大家分享5个.NET开源、简单、易用、免费的任务调度框架,帮助大家在做定时任务调度框架技术选型的时候有一个参考。以下开源任…

共享益——成果展示

共享益——成果展示 页面展示前端部分开发代码: <script setup> import { User, Lock } from "@element-plus/icons-vue"; import { ElMessage } from "element-plus"; import { ref } from "vue"; import { userRegisterService, userLog…

El-Upload组件上传图片并添加水印

背景 有的时候我们需要在上传图片中添加一些水印标识,然后上传至服务器 效果图代码 <template><div class="app"><!-- 需求:1. 点击直接预览图片,而不需要使用dialog2. 上传图片添加水印后才预览图片思路:上传图片文件添加水印。使用watermark…

kube-proxy 流量流转方式

简介 kube-proxy 是 Kubernetes 集群中负责服务发现和负载均衡的组件之一。它是一个网络代理,运行在每个节点上, 用于 service 资源的负载均衡。它有两种模式:iptables 和 ipvs。 iptables iptables 是 Linux 系统中的一个用户空间实用程序,用于配置内核的网络包过滤和网络地…

2024年5月8日

今天学习了web页面顶部栏的使用和连接的使用和跳转,对web页面进行了美化<template><div class="common-layout"><el-container><el-header class="el-header"><img src="../photos/logo.png" width="200"…

Mysql-Mvcc原理

0.背景 在mysql的并发访问中,有几个典型的并发场景:读-读:无需处理,都是读取,不会对数据有影响。写-写:由于都涉及到数据的修改,不可能乱改,所以没有较好的方式来处理,一般都得加锁。读-写:读写场景,加锁当然ok。不过读操作是很频繁的,一但写数据就不让读取了,这种…

软件测试学习之linux学习

今天是第三天,主要学了函数

Shell编程之条件语句

目录1.条件测试2.文件测试与整数测试(1)文件测试(2)整数测试3.字符串测试与逻辑测试(1)字符串测试(2)逻辑测试4.if语句(1)if单分支语句(2)if双分支语句(3)if多分支语句5.case分支语句 1.条件测试 Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,…