class文件是一组以8位字节为基础的二进制流。各个数据项目严格按照顺序精密的排列在class文件之中。中间没有添加任何分隔符。
无符号数:基本的数据类型,以u1、u2、u4、u8 来分别代表一个字节,两个字节,4个字节,8的字节的无符号数。无符号数可以用来描述数字、索引引用、数量值、或者按照UTF-8编码构成字符串值。
表:由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性的以‘_info’结尾。
表用于描述由层次关系的符合数据类型结构的数据。整个class文件本质上就是一张i表。
魔数:每个class文件的头4个字节称为魔数(magic number) 它的唯一作用是用于确定这个文件是否能被虚拟机接受的class文件。
java的版本号从45开始JDK1.1之后每个JDK大版本发布本号向上加1,高版本的JDK能向下兼容。
class文件结构中只有常量池的容量计数是从1开始的。0表示不引用。
常量池之中主要存放两个类常量:字面量和符号引用。字面量如文本字符串、被声明为final 的常量值等。符号引用属于编译原理方面的概念,包括三类常量:
类和接口的全限定名(Fully Qualified Name)
字段的名称和描述符 (Descrioptor)
方法的名称和描述符
常量池中的每一项常量都是一个表,共有11中 结构各不相同的表结构数据,这11种表都有一个共同的特点。第一位是一个 u1 类型的标志位 tag,取值为1-12,缺少标志为2的数据类型。