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、常量池(CONSTANT_POOL_COUNT、CONSTANT_POOL)

5.1、constant_pool_count(常量的个数)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unsupported class file major version 61 表示Java编译器版本与当前Java运行时环境不兼容。每个Java版本都有一个对应的class file major version。在你的情况下,报错显示的是版本号为63的不支持。这通常是因为你使用的Java版本过低,无法识别和解析新版本的class文件。 为了解决这个问题,你需要升级你的Java版本,以使其与编译时使用的Java版本保持一致。你可以根据报错信息中提供的Java class文件路径中的文件名来确定是哪个类文件的版本不支持,然后使用相应的Java版本进行编译和运行。 你可以使用以下步骤来解决这个问题: 1. 确认你正在使用的Java版本。可以通过在命令行中运行`java -version`来查看。 2. 确认编译时使用的Java版本。可以通过在命令行中运行`javac -version`来查看。 3. 如果编译时使用的Java版本高于你当前的Java版本,那么你需要升级你的Java版本。 4. 请注意,在升级Java版本之前,请备份你的项目代码和数据,以防止意外情况发生。 5. 下载并安装最新的Java开发工具包(JDK)版本。 6. 配置你的开发环境,确保使用的是新安装的Java版本。可以通过设置JAVA_HOME环境变量来指定Java安装路径,以及将新的Java路径添加到系统的PATH环境变量中。 7. 重新编译和运行你的程序,确保不再出现Unsupported class file major version错误提示。 通过以上步骤,你应该能够解决Unsupported class file major version 61的问题,并成功编译和运行你的程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [spring注解报错Unsupported class file major version 63](https://blog.csdn.net/H1519223775/article/details/128466989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值