Java平台无关性的基石   class文件字节码

任何一个calss文件都对应唯一一个类或者接口的定义信息,但是,类或者接口的定义信息比一定都得定义在class文件中,例如,类或者接口也可以通过类加载器直接生成

class文件是一组以8字节为基础单位的二进制流

无符号数和表

无符号数:u1 u2 u4 u8

整个class文件就是一张表

class文件每个字节的含义、长度、先后顺序都严格规定

u4   magic  魔数  0xCAFEBABE

u2   minor_version  次版本号

u2   major_version  主版本号

u2   constant_pool_count  常量池容量计数器(class文件空间最大的数据项目之一)  从1开始,真正的常量个数是 constant_pool_count  -  1个

pc_info   constant_pool  常量池中存放字面量(String、final static)和符号引用(类或接口的全限定名、字段的名称和描述符、方法的名称和描述符),虚拟机运行时,从常量池中获得对应的符号引用,在类创建时或运行时解析到真正的内存地址中。常量池中的每一个都是一个表。不同类型的常量的结构不同,但是第一位都是一个标志位,标志常量的类型(UTF-8编码字符串(一般是类或接口的全限定名)、整型、浮点、长整型、双精度浮点、类或接口的符号引用、String、字段的符号引用、类中方法的符号引用、接口中方法的符号引用、……)

u2   access-flags  访问标识(是类还是接口、public?、final?、注解?、枚举?、abstract?)

u2   this_class  类索引(类的全限定名)

u2   super_calss  父类索引(父类的全限定名)Java中,任何一个类都继承Object类,因此,除了Object类,任何类的父类索引都不为0

u2   interface_count  接口个数

u2   interfaces  接口索引集合

  类索引、父类索引、接口索引集合,定义了一个类的继承关系,他们各自指向常量池中一个类或接口的符号引用,类或接口符号引用中的索引值指向UTF-8编码字符串中的全限定名

u2   fields_count  字段的个数(接口或者类中声明的变量,实例变量,不包括局部变量)

field_info   fields  字段集合表(一个字段表的结构包括访问标识(用一个标志位)、字段的名字(指向常量池中的字段符号引用)、字段的类型(常量池中的描述))

u2   mothed_count  方法的个数

method_info   methods  方法表集合(访问标志、方法名、方法参数)

u2   attributes_count  属性个数

attribute_info   attribute  属性表集合(什么存放在属性表中?final staic int i = 123,此时,有一个ConstantValue属性,其值指向常量123;方法编译之后的字节码指令,存放在Code属性里)