Class文件格式简述
Class文件格式
图中是以java8的class字节码文件结构为例(以16进制展示),以下进行对该结构进行解析。
1. Magic
文件开头的4个字节用来存储magic(魔数),以16进制显示为CA FE BA BE,是class文件的统一标识符。jvm通过magic判断文件是否为class文件,以及文件是否受损(文件开头受损的可能性最大)。
2. 大小版本号
在magic后面的4个字节(第5-8字节)用于存储大小版本号(major version、minor version),小版本号在前两个字节,大版本号在后两个字节。上图中小版本号为0,大版本号转化为10进制是52,对应jdk版本参考下表(参考简书https://www.jianshu.com/p/fc44fdb337a6):
Major Version | Minor Version | jdk版本 |
---|---|---|
45 | 3 | 1.1 |
46 | 0 | 1.2 |
47 | 0 | 1.3 |
48 | 0 | 1.4 |
49 | 0 | 1.5 |
50 | 0 | 1.6 |
51 | 0 | 1.7 |
52 | 0 | 1.8 |
53 | 0 | 1.9 |
54 | 0 | 1.10 |
55 | 0 | 1.11 |
3. 常量池
版本号后面的两个字节(第9-10字节)用来存放常量池大小的计数(constant_pool_count),最大计数65535(16^4 - 1)。
常量计数往后的字节用于存放常量池的数据、访问修饰符、类的全限定名(包+类名)、父类的全限定名、实现接口数、接口常量、字段数、具体字段、方法数、具体方法、属性数、具体属性等信息。
4. Class字节码阅读器
idea使用Jclasslib插件可以对class文件进行解析查看。
后续阅读 JVM复习(三)-- 类加载器