字节码文件组成部分
1、基本信息
1.1 Magic 魔数
- 文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件的内容。
- 软件使用文件的头几个字节(文件头)去校验文件的类型,如果软件不支持该种类型就会出错。
- Java字节码文件中,将文件头称为magic魔数。
文件类型 | 字节数 | 文件头 |
---|---|---|
JPEG (jpg) | 3 | FFD8FF |
PNG (png) | 4 | 89504E47(文件尾也有要求) |
bmp | 2 | 424D |
XML (xml) | 5 | 3C3F786D6C |
AVI (avi) | 4 | 41564920 |
Java字节码文件(•class) | 4 | CAFEBABE |
1.2 主副版本号
- 主副版本号指的是编译字节码文件的JDK版本号
- 主版本号用来标识大版本号,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升级一个大版本就加1
- 副版本号是当主版本号相同时作为区分不同版本的标识,一般只需要关心主版本号。
- 版本号的作用主要是判断当前字节码的版本和运行时的JDK是否兼容。
1.2之后大版本号计算方法就是:主版本号 - 44,例如主版本号 52 即为 JDK8
主版本号不兼容导致的错误:
类文件具有错误的版本 52.9,应为 50.0
请删除该文件或确保该文件位于正确的类路径子目录中。
解决方案:
- 第一种,升级JDK版本
- 第二种,将第三方依赖的版本号降低或者更换依赖,以满足JDK版本的要求
2、常量池
字节码文件中常量池的作用:避免相同的内容重复定义,节省空间。
常量池中的数据都有一个编号,编号从1开始。在字段或者字节码指令中通过编号可以快速的找到对应的数据。
字节码指令中通过编号引用到常量池的过程称之为符号引用。
3、方法
字节码中的方法区域是存放字节码指令的核心位置,字节码指令的内容存放在方法的Code属性中。
4、查看字节码文件
- 本地文件可以使用 jclasslib 工具查看,开发环境使用
jclasslib
插件。 - 服务器上文件使用 javap 命令直接查看,也可以通过 arthas 的
dump
命令导出字节码文件再查看本地文件。还可以使用jad
命令反编译出源代码。