Class文件解析

本文详细介绍了Java Class文件的结构,包括魔数、版本号、常量池、访问标志、类索引、父类索引、常量池详细解析、Method属性、Fields属性以及attributes_count和attribute等内容。通过对这些组成部分的解析,展示了Class文件如何存储和组织程序运行所需的信息。
摘要由CSDN通过智能技术生成

Class文件

Class文件是一组以8个字节为基础单位的二进制字节流。
各项数据会严格的按照顺序紧凑的排列在class文件中,中间没有分隔符,使得class文件存储的内容几乎全部都是程序运行的。
  根据《JAVA虚拟机规范》规定,class文件格式采用的类似C语言的结构体的伪结构来存储的,这种结构只有两种数据类型。 无符号数和表。
  无符号数
  无符号数属于基本数据数据类型,以u1,u2,u4,u8代表一个字节,两个字节…的无符号数,无符号数可以用来描述数字,索引,数量值或者按照UTF-8编码构成的字符串值。
  
  表由多个无符号数或者其他表作为数据项构成的复合数据类型。所有的表命名都习惯以_info结尾,表主要用于描述有层次关系的复合结构数据。 比如:方法、字段,需要注意的是class文件没有分隔符,所以每个二进制数据类型都是严格定义的。
  整个Class文件本质上也可以视作是一张表。
  Class文件的格式如下:
  在这里插入图片描述

魔数

1 .每一个class文件的头4个字节 被称为魔数 magicNumber
2 . 唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件
3. Class文件魔数值为0xCAFEBABE 如果以个文件不是以CAFEBABE开头,那么它就肯定不是java的class文件。
那么它也是java.class的识别魔数。

很多的文件存储标准中都使用魔数来识别文件的身份。 譬如图片格式.gif 或 jpeg等在文件的头部都存有魔数,使用魔数而不是文件的扩展名称来判断 ,这种情况是处于安全的考虑。

文件版本号

紧挨着魔数的4个字节存储的是Class文件的版本号:第五个和第六个字节是次版本号 --minor_version ,第七第八个字节是主版本号–major_version。
   这个版本号随着jdk版本的不同而表示不同版本的范围。Java的版本号是从45开始的
如果class的版本号超过虚拟机的版本 会被拒绝执行。

JDK1.2 ----0X002E 46
JDK1.3 ----0X002F 47
JDK1.4 ----0X0030 48
JDK1.5 ----0X0031 49
JDK1.6 ----0X0032 50
JDK1.7 ----0X0033 51
JDK1.8 ----0X0034 52

下图可以清楚地看见开头4个字节的十六进制表示OxCAFEBABE,代表次版本号的第5个和第6个字节值为Ox0000,而主版本号的值为Ox0032,也即是十进制的50,该版本号说明这个是可以被JDK6或以上版本虚拟机执行的Class文件。

在这里插入图片描述

常量池

紧跟着魔数与版本号之后的是常量池入口,常量池简单理解为class文件的资源库。

  1. 它是class文件结构中与其他项目关联最多的数据类型
  2. 是占用class文件空
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀发嚯嚯没

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值