JVM的故事——类文件结构

类文件结构

文章目录

  • 类文件结构
  • 一、概述
  • 二、无关性基石
  • 三、Class类文件的结构


一、概述

计算机是只认由0、1组成的二进制码的,不过随着发展,我们编写的程序可以被编译成与指令集无关、平台中立的一种格式。

二、无关性基石

对于不同平台和不同平台的Java虚拟机,都支持一种程序存储格式—字节码。Java虚拟机并不与Java这个语言绑定,它只与class文件绑定。任何语言编译后生成的class文件都可以在Java虚拟机上运行。
在这里插入图片描述

三、Class类文件的结构

Java语言一直保持着良好的向后兼容性,Class文件结构的稳定功不可没。在Java语言经历了许多的改进和更新,Class文件的结构和功能几乎没有变化,只有一些新增和补充内容。
任何一个class文件都对应着唯一的一个类或者接口的定义信息,但并不一定每个类或者接口都有着对应的class文件(可以动态生成,直接进入类加载器中)。
Class文件是一组以8个字节为基础单位的二进制流,中间没有任何的分隔符。当遇到大于8个字节的空间存储时,会按照高位在前把变量分割成若干个8个字节进行存储。Class文件存储数据只通过两种结构:无符号数和表。u1、u2、u8代表1、2、8个字节的无符号数。表是由多个无符号数或者其它表构成的结构,表的命名都习惯性地以”_info”结尾。整个class文件也可以看成一张表,表的组成结构如下图。
在这里插入图片描述
1、魔数与Class文件的版本
每个class文件的头四个字节是魔数,这是用来辨别该class文件是否可以被虚拟机接受。许多类型的文件都有魔数,例如gif、jpg等。使用魔数比使用后缀名辨别文件格式更加安全,因为后缀名是可以更改的。文件格式的魔数由制定者自己定义,class文件的魔数是0XCAFEBABE
紧接着魔数后面的四个字节是class文件的版本号定义,第五六字节定义的是次版本号(minor version),第七八字节定义的是主版本号(major version)。Java的class文件版本号是从45开始的,每个Java的大版本发布,主版本号就加一。高版本JDK可以兼容低版本的class文件。
在这里插入图片描述
分析此图,由5、6位是0x0000可以得出次版本号为0,由7、8位是0x0032可以得出主版本号是50,所以该class文件版本号是50.0,对应的JDK版本应该是JDK1.6,JDK1.6能支持版本号为45.0-50.65535的class文件。

2、常量池
在主次版本号之后的就是常量池,它是class文件中的资源仓库,占用着大量的数据,也是第一个出现的表类型数据项。
常量池的入口需要放置一个u2类型的数据,来表示有多少常量。这个容量的计数是从1开始而不是从0开始的
在这里插入图片描述
如此图,可以看见偏移地址0x00000008处,值为0x0016,即常量池的容量为22,那么就有21个常量,索引为1-21。把0空出来是为了表达不引用任何一个常量来设计的。不过除了常量池的其它集合,索引还都是从0开始的。
常量池中的每一个常量都是一个表,截止JDK13,常量表中一共有17种不同类型的常量。这些常量表都有一个相同的特点,就是它们的第一位是u1类型的标志位。
在这里插入图片描述
下面开始对常量进行分析
在这里插入图片描述
第0x00000008偏移位说明了有21个常量。从0x0000000A开始,0x07是第一个常量的标志位(tag),根据6-3常量池的项目类型可以得知这是一个类或接口的符号引用
在这里插入图片描述

根据表6-4就可以知道接下来两个字节要表示这个常量的name_index,即常量池的索引值。它指向一个CONSTANT_Utf8_info类型常量,这个常量代表类的全限定名。从偏移位0x0000000B开始,可以知道该常量的索引值为0x0002,即指向第二个常量。
那么就从0x0000000D开始,看第二个常量,标志位为0x01,由表6-3可知该常量是UTF-8编码的字符串。这里使用的是UTF-8缩略编码,区别是:从’\u0001’到’\u007f’之间的字符(相当于1~127的ASCII码)的缩略编码使用一个字节表示, 从’\u0080’到’\u07ff’之间的所有字符的缩略编码用两个字节表示,从’\u0800’开始到’\uffff’之间的所有字符 的缩略编码就按照普通UTF-8编码规则使用三个字节表示。(其实就是省略所有前面的0)
在这里插入图片描述
由表6-5,可以从偏移位0x0000000E开始,看该字符串的length,为0x001D,即29。往后29 个字节正好都在1~127的ASCII码范围以内,内容为“org/fenixsoft/clazz/TestClass
可以使用javap指令输出常量表,由输出的常量对比,发现分析的两个常量都是正确的。
在这里插入图片描述
像常量表中的如“I”“V”“”这些,在程序中并没有,它们是由编译器自动生成的,是用来描述一些不方便用固定字节描述的内容的。

3、访问标志
在常量池结束后,后面两个字节是访问标志。访问标志代表着该类或接口的访问信息

在这里插入图片描述
比如6-1中的代码,TestJava是一个普通的Java类。它被public修饰,并且使用了JDK1.2之后的编译器进行编译,所以它的access_flag应该是0x0001|0x0020=0x0021


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(上)

文章目录 文章引入IO模型及概念梳理BIO简单介绍代码样例压测结果 NIO(单线程模型)简单介绍与BIO的比较代码样例压测结果 多路复用器问题引入 文章引入 如果你对BIO、NIO、多路复用器有些许疑惑, 那么这篇文章就是肯定需要看的, 本文将主要从概念, 代码实现、发展历程的角度去突…

时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测

时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测&a…

Matlab——二维绘图(最为详细,附上相关实例)

为了帮助各位同学备战数学建模和学习Matlab的使用,今天我们来聊一聊 Matlab 中的绘图技巧吧!对于 Matlab 这样的科学计算软件来说,绘图是非常重要的一项功能。在数据处理和分析时,良好的绘图技巧能够更直观地呈现数据,…

Matlab(GUI程式设计)

目录 1.MatlabGUI 1.1 坐标区普通按钮 1.1.1 对齐组件 1.1.2 按钮属性 1.1.3 脚本说明 1.1.4 选择呈现 1.3 编译GUI程序 在以前的时候,我们的电脑还是这样的 随着科技的不断进步,我们的电脑也发生着翻天覆地的改变1990s: 在未来&#xff0c…

Kubernetes(k8s)上部署redis5.0.14

Kubernetes上部署redis 环境准备创建命名空间 准备PV和PVC安装nfs准备PV准备PVC 部署redis创建redis的配置文件部署脚本挂载数据目录挂载配置文件通过指定的配置文件启动redis 集群内部访问外部链接Redis 环境准备 首先你需要一个Kubernetes环境,可参考我写的文章&…

数据结构之树型结构

相关概念树的表示二叉树二叉树性质二叉树储存 实现一颗二叉树创建遍历(前中后序)获取树中节点个数获取叶子节点个数获取第k层节点个数获取二叉树高度检测值为value元素是否存在层序遍历(需要队列来实现)判断是否为完全二叉树&…

Window11-Ubuntu双系统安装

一、制作Ubuntu系统盘 1.下载Ubuntu镜像源 阿里云开源镜像站:https://mirrors.aliyun.com/ubuntu-releases/ 清华大学开源软件镜像网站:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 选择想要的版本下载,我用的是20.04版本。 2…

【送书活动】深入浅出SSD:固态存储核心技术、原理与实战

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

leetcode76. 最小覆盖子串(滑动窗口-java)

滑动窗口 最小覆盖子串滑动窗口代码 上期经典 最小覆盖子串 难度 - 困难 原题链接 - 最小覆盖字串 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t…

SpringBoot集成JWT token实现权限验证

JWTJSON Web Token 1. JWT的组成 JWTHeader,Payload,Signature>abc.def.xyz 地址:JSON Web Tokens - jwt.er 1.1 Header Header:标头。 两个组成部分:令牌的类型(JWT)和所使用的签名算法,经过Base64 Url编码后形成…

vue使用vant中的popup层,在popup层中加搜索功能后,input框获取焦点 ios机型的软键盘不会将popup顶起来的问题

1.使用vant的popup弹出层做了一个piker的选择器,用户需要在此基础上增加筛选功能。也就是输入框 2.可是在ios机型中,input框在获取焦点以后,ios的软键盘弹起会遮盖住我们的popup层,导致体验不是很好 3.在大佬的解答及帮助下,采用窗口滚动的方式解决此方法 <Popupv-model&q…

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录&#xff0c;如果你使用root登陆&#xff0c;那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…