文章目录
1. magic(魔术)
每个Class文件的头4个字节称为魔数(Magic Number)
唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。
Class文件魔数的值为0xCAFEBABE。如果一个文件不是以0xCAFEBABE开头,那它就肯定不是Java class文件。
很多的文件存储标准中都使用魔数来识别文件的身份。 譬如图片格式.gif 或 jpeg等在文件的头部都存有魔数,使用魔数而不是文件的扩展名称来判断 ,这种情况是处于安全的考虑。
2.class文件版本号
紧挨着魔术的4个字节表示class的文件的版本号 版本号:
1.次版本号 --minor_version 前2个字节用于表示次版本号 例如:00 00
2.主版本号 --major_version 后2个字节用于表示主版本号 例如: 00 34
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
3. constant_pool_count
版本号后面是常量池的个数,占两个字节。
constant_pool_count 从1开始计数的。 class文件结构中只有常量池的容量计数是从1开始的。第0项腾出来满足后面某些指向常量池的索引值的数据,在特定的情况下需要表达“不引用任何一个常量池项目” 把索引值的第0项留给JVM自己用。
4. constant_pool
长度为 constant_pool_count-1
常量池详细解析常量类型总共有18个编号的常量类型。
constant_pool的具体内容:索引,标志tag,类型
1.编号1: CONSTANT_UTF8_INFO
Tag1 ------占用一个空间字节
Length: utf-8字符串占用的字节数
Bytes 长度为length字