JAVA-JVM 之Class字节码文件的组成 【上篇】

news2024/11/23 17:11:47

字节码

  • 前言
  • 概述
  • 基本结构
  • 魔数头
  • 版本号
  • 常量池
  • 访问标志

在这里插入图片描述

主页传送门:📀 传送

前言


  java的特点是跨平台性,而跨平台的运行标准是Class字节码文件,Class字节码是提供平台无关性的基础模型,使我们无须考虑如何兼容异构系统,只须被JVM识别即可。

概述


  字节码是Java虚拟机中的核心,是Java源代码的一种中间表示形式。简单来说,字节码就是将Java源代码转换为二进制格式后的中间代码。JVM通过将Java源代码编译成字节码,再通过字节码解释器将其转换为可以在不同平台上运行的本地机器码,从而实现Java跨平台的能力。

  字节码是一种中间代码,其本身并不直接被执行,而是需要经过JVM的解释或编译才能成为可执行的本地机器码。JVM在执行字节码时,会根据不同的阶段进行处理:在编译阶段,将字节码编译成本地机器码;在运行阶段,直接执行编译后的本地机器码。

  Class文件是一组以8位字节为基础单位的二进制字节流,所有16位、32位和64位长度的数据将被构造成2个、4个和8个字节单位来描述。

基本结构


  Class文件采用类似于C语言结构体伪结构来存储数据,只有两种数据类型

  • 无符号数

    • 基本数据类型,以u1,u2,u4,u8来分别表示一个字节,两个字节,四个字节和8个字节
    • 复合结构。由多个无符号数或者其他表作为数据项构成的类型,每个表都以"_info"结尾

    • 主要用于描述有层次关系的复合结构数据,整个Class文件本质上可以看成一张表

总体结构如下图所示:

image.png

注意:
上图Class文件中的数据项,无论顺序是数量,甚至于数据存储的字节序这样的细节,都是被严格限定的。哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变

魔数头


  Class文件的1-4个字节代表该文件的魔数头。(用于标记该文件格式)Class文件格式的魔数值固定为“0xCAFEBABE” 无法修改

  唯一功能: 判断该文件格式是否为一种能被虚拟机接受的Class文件。(基于安全方面的考虑,在做软件的文件上传功能的时候,一定是要读取内容判断魔数而不是判断后缀名。)

版本号


  魔数头后的4个字节存储的就是Class文件的版本号(包括副版本号minor_version和主版本号major_version),其中5,6个字节表示Class文件的副版本号。7,8个字节表示Class文件的主版本号。主版本号和副版本号共同确定类文件格式的版本。

  JVM实例只提供特定范围的主版本号(Mo-Mn)和0至特定范围内(0至m)的副版本号。
版本对于关系如下表:

JDK版本副版本号主版本号十进制
JDK1.20000002E46
JDK1.30000002F47
JDK1.40000003048
JDK1.50000003149
JDK1.60000003250
JDK1.70000003351
JDK1.80000003452

常量池


版本号之后是常量池相关的数据项,主要包含俩部分:

  • 常量池索引计数器
    • u2的无符号数,主要用于记录常量池中相关元素数量,值只在大于0且小于constant_pool_count时才有效。
  • 常量池元数据
    • 字面量

      • 文本字符串
      • 声明为final的常量值
      • 等….
    • 符号引用

      • 类和结构的全限定名(类元数据,接口元数据)
      • 字段的名称和描述符(字段元数据,字段符号引用)
      • 方法的名称和描述符(方法元数据,方法符号引用)
      • 属性元数据
      • 对常量池中数据项的引用,此外常量池中各个项也会互相引用
      • 字节码指令中也存在对常量池的引用。

1698238190338.jpg

再来看CONSTANT_Class_info ,结构如下图:

image.png
由于已经确定了数据的表结构,所以他并没有tag,所以0x0004就表示后面的index,即指向全限定名的常量项目的索引,而他指向第四个常量

访问标志


  紧接着常量池后面的两个字节(u2类型)就表示访问标志位,它是种掩码标志,用于表示某个类或者接口的访问信息及基础属性。具体含义如下图:

1698239075416.png

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

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

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

相关文章

车载电子电器架构 —— 基于AP定义车载HPC

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

提升演讲与口才的三种方法

演讲和口才是在现代社会中非常重要的技能。无论是在职场中进行演讲,还是在日常生活中与他人进行交流,具备良好的演讲和口才能力都能给人带来诸多优势。然而,要提升自己的演讲和口才能力并不是一件容易的事情。在本文中,我将介绍三…

【机器学习】决策树与分类案例分析

决策树与分类案例分析 文章目录 决策树与分类案例分析1. 认识决策树2. 分类3. 决策树的划分依据4. 决策树API5. 案例:鸢尾花分类6. 决策树可视化7. 总结 1. 认识决策树 决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最…

pre-existing shared memory block

发生原因: 1.服务器cpu、内存进行扩容 2.非正常关闭,导致任在占用共享内存段 解决方案: 根据shmid进行关闭 ipcs -mipcrm -m xxx

进程替换..

1、单进程版 – 最简单的先看看程序替换 现象就是 1、我们用自己的进程封装了内置指令ls,并且代码中execl 后 printf 的after并没有打印出来。 2、谈进程替换的原理 单进程替换基本原理 上面例子中execl的做法非常简单粗暴,要调用ls,那么就把mycom…

使用Python,mediapipe构建手部姿势探测器

使用Python,mediapipe构建手部姿势探测器 1. 效果图2. 手部标志3. 源码参考 这篇博客将介绍手部标志是什么,以及如何使用Python,mediapipe构建手部姿势探测器, Mediapipe是一个跨平台的库,由谷歌开发,为计…

【pandas技巧】group by+agg+transform函数

目录 1. group by单个字段单个聚合 2. group by单个字段多个聚合 3. group by多个字段单个聚合 4. group by多个字段多个聚合 5. transform函数 studentsgradesexscoremoney0小狗小学部female958441小猫小学部male938362小鸭初中部male838543小兔小学部female909314小花小…

KubeSphere 社区双周报 | KubeKey 支持 Web UI | 2023.10.13-10.26

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.10.13-2023.…

No module named ‘skimage.viewer‘解决方法

问题 在使用https://github.com/DinoMan/face-processor工具时出现的问题 解决方法 scikit-image0.20官网中提到已经移除了skimage.viewer 可以安装0.18版本的: python -m pip install -U pip python -m pip install -U scikit-image0.18

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇3)#涂国旗 #重新排序

目录 题目:涂国旗 思路: 题目:重新排序 思路: 题目:涂国旗 思路: 乍一看好像没啥思路,但是我们需要涂最少的格子,所以要都尝试一下才行,也就是从上面开始白至少一行&am…

SpringBoot 公司推广系统 公司广告系统

SpringBoot 公司推广系统 公司广告系统 系统功能 首页功能: 广告展示 方案列表 站内搜索 资讯 查看详细咨询 登录注册 收藏 咨询方案 在线客服实时聊天 后台管理功能: 系统管理分为: 用户管理 角色管理 客户管理 首页轮播管理 公告管理 方案管理: 方案管理 资讯管理: 类型管…

【OJ for Divide and Conquer】OJ题解

文章目录 A - Ultra-QuickSortB - Hanoi Tower Troubles Again! [找规律递归]C - Fibonacci Again[找规律]E - [Fire Net](https://programmerall.com/article/7276104269/)[DFS 搜索 ⭐⭐]F - Gridland[找规律]G - Maximum Subarray Sum[动态规划/分治..经典⭐]I - Quoit Desi…

在线运行C++的网站(欢迎补充)

1、https://cpp.sh/ 谷歌打开,好用 2、https://godbolt.org/ 会显示汇编

Beyond Compare4 30天试用到期的解决办法

相信很多小伙伴都有在使用Beyond Compare 4软件,如果我们没有激活该软件,就只有30天的评估使用期,那么过了这30天后我们怎么继续使用呢?下面小编就来为大家介绍方法。 打开Beyond Compare4,提示已经超出30天试用期限制…

单目深度估计之图像重构原理解析

一、参考资料 浅析自监督深度估计中的光度损失(Photometric Loss) 二、图像重构原理 设输入位姿估计网络的3帧连续单目序列为 < I t − 1 , I t , I t 1 > <I_{t-1},I_{t},I_{t1}> <It−1​,It​,It1​>&#xff0c;其中 t t t 为时间索引&#xff0c;…

Java SE 学习笔记(十九)—— XML、设计模式

目录 1 XML1.1 XML 概述1.2 XML 语法规则1.3 XML 文档约束&#xff08;了解&#xff09;1.3.1 DTD 约束1.3.2 schema 约束 2 XML 解析2.1 XML 解析概述2.2 Dom4J 解析 XML 文件2.3 XML 解析案例 3 XML 检索4 设计模式4.1 工厂模式4.2 装饰模式 1 XML 在有些业务场景下&#xff…

文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题

四、用go语言&#xff0c;对于一个含 n个结点的任意有根树&#xff0c;写出一个 O(n)时间的过程&#xff0c;输出其所有关键字该树以左孩子右兄弟表示法存储。 文心一言&#xff1a; 在计算机科学中&#xff0c;左孩子右兄弟表示法是一种用于表示树状结构的方法&#xff0c;其…

springboot--基本特性--自定义 Banner

SpringApplication的使用 前言效果1.1 自定义banner1.2 自定义SpringApplication配置文件优先级高于程序化调整的优先级启动自定义banner关闭自定义banner 1.3 FluentBuilder API 前言 修改启动时候的修改banner 效果 1.1 自定义banner banner制定官网链接 在配置文件中设置…

sentinel规则持久化-规则同步nacos-最标准配置

官方参考文档&#xff1a; 动态规则扩展 alibaba/Sentinel Wiki GitHub 需要修改的代码如下&#xff1a; 为了便于后续版本集成nacos&#xff0c;简单讲一下集成思路 1.更改pom 修改sentinel-datasource-nacos的范围 将 <dependency><groupId>com.alibaba.c…

Qt之DLL的使用(关联DLL生成篇)

文章目录 一、示例二、使用步骤1.所需文件2.添加库3.选择库4.完成添加5.导入类使用 相关文章 一、示例 下图为使用DLL的示例图 二、使用步骤 1.所需文件 将所需要使用的相关库&#xff08;导出项目的库&#xff0c;包括Debug和Release两个编译模式的库&#xff0c;缺少某个…