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属性里)