class 类文件
- 为了让 Java 语言具有良好的跨平台能力
- 只要安装了虚拟机都可以直接运行字节码类文件(.class文件)
- 解除了 Java 虚拟机和 Java 语言之间的耦合
- 是Java 虚拟机支持更多语言的桥梁
class 文件数据结构
class 文件里只有2种数据结构:无符号数和表
1. 无符号数
属于基本的数据类型,以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节和 8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者字符串(UTF-8 编码)
2.表
表是由多个无符号数或者其他表作为数据项构成的复合数据类型,class文件中所有的表都以“_info”结尾。其实,整个 Class 文件本质上就是一张表
class 文件结构
- 无符号数和表是组成class 文件结构各个部分的元素
- 各结构按顺序紧密的从前向后排列,之间不留间隙
当 JVM 加载某个 class 文件时,JVM 就是根据上图中的结构去解析 class 文件,加载 class 文件到内存中,并在内存中分配相应的空间。具体某一种结构需要占用大多空间,可以参考下图:
魔数 magic number
是 class 文件的标志, 在 class 文件开头的四个字节固定的值(0xCA,0xFE,0xBA,0xBE), 决定是否能被JVM 识别或加载
版本号
前两个字节 0000 代表次版本号,后两个字节 0034 是主版本号,对应的十进制值为 52,也就是说当前 class 文件的主版本号为 52,次版本号为 0。所以综合版本号是 52.0,也就是 jdk1.8.0
常量池
- 常量池中的每一项都是一个表
- 常量池中保存了类的各种相关信息(类和父类的名称、类中的方法名、参数名称、参数类型等)
常量池中的每一项都是一个表,其项目类型共有 14 种,如下表所示: