classfile解析的内容

目录

一、前言

二、Classfile文件结构解析

1、无符号数

2、表

3、魔术(magic) 

3.1、每一个class文件的头4个字节,被称为魔数 magicNumber

3.2、总结魔术的用处:

4、Class文件的版本号(minor_version、major_version)

4.1、minor_version(次版本号)

 4.2、major_version(主版本号)

5、常量池(CONSTANT_POOL_COUNT、CONSTANT_POOL)

5.1、constant_pool_count(常量的个数)

5.2、constant_pool(常量池)

 5.3、常量池详细解析常量类型

6、access_flag(类的访问控制权限)

7、this_class(类名) 

8、 super_class (父类名) 

9、interface_count(接口个数)

10、interfaces(接口名) 

11、Method(方法表)

12、Fields(域的表)

13、attributes_count(附加属性的数量) 和attribute(附加属性)

13.1、附加属性

13.2、Code属性表的结构

 14、案例分析


一、前言

在讲解内容之前我们要先了解什么是classfile,在java中它通过javac编译后生成的一个Class文件,而这个Class文件是一组以8个字节为基础单位的二进制字节流。各项数据会严格的按照顺序紧凑的排列在class文件中,中间没有分隔符,使得class文件存储的内容几乎全部都是程序运行的。

举个例子:

一个非常简单的代码,它运行之后则会产生class文件

打开class文件里面内容如下

 

二、Classfile文件结构解析

class文件格式采用的类似C语言的结构体的伪结构来存储的,这种结构只有两种数据类型:无符号数

1、无符号数

属于基本数据类型 主要用于描述数字索引符号数量值、或者按照UTF-8编码构成的字符串值,而数据类型包括:u1(1个字节)、u2(2个字节)、u4(4个字节)、u8(8个字节)。

2、表

 由多个无符号数或者其他表作为数据项构成的复合数据类型。所有的表都习惯以_info结尾。表主要用于描述有层次关系的复合结构数据。 比如 方法字段 需要注意的是class文件没有分隔符,所以每个二进制数据类型都是严格定义的 具体的顺序如下:

接下来我们将根据classfile进行逐一分析

3、魔术(magic) 

3.1、每一个class文件的头4个字节,被称为魔数 magicNumber

从上表可以看到magic类型u4因此占用4个字节cafe babe则刚好是4个字节,而这里的cafe babe唯一的作用是用来判断该文件是否是一个能被虚拟机接受的class文件,因此如果该文件不是以cafebabe开头则其不是一个java的class文件。

3.2、总结魔术的用处:

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

4、Class文件的版本号(minor_version、major_version)

4.1、minor_version(次版本号)

同理从表中可以看出其是u2则其是占用2个字节,从我们的class文件可以看到其为0000

 4.2、major_version(主版本号)

同理从表中可以看出其是u2则其是占用2个字节,从我们的class文件可以看到其为0034

而这里的0034是有特殊含义的,它的版本号会随着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

5、常量池(CON

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值