找一个class文件,用文本工具打开如图所示
按照上面的二进制编码,了解他的组成结构
1、魔数
所有的java编译器编译而成的class文件的前四个字节都是OXCAFEBEBE
作用:在JVM在尝试加载某个文件到内存中来的时候,会首先判断此class文件有没有jvm认为可以接受的‘签名’,即jvm会首先读取文件的前四个字节,如果是OXCAFEBEBE,则JVM会认为可以将此文件当作class文件来加载并使用。
2、版本号
主版本号和次版本号再class文件中各占两个字节,副版本号占用第5.6两个字节,主版本号则占用第7.8两个字节。JDK1.0的主版本号45,以后每个新主版本号都会在原先版本的基础上加一,若现在使用jdk1.7编译出来的class文件,则相应的主版本号应该是51,对应的7.8个字节的十六进制的值是0X33
3、常量池计数器
常量池是class文件中非常重要的结构,他描述着整个class文件的字面量信息。常量池是由一组constant _pool结构体数组组成,而数组的大小则由常量池计时器指定。常量池计数器constant_pool_count的值=constant_pool表中的成员数+1。constant_pool表的索引值只有大于0且小于constant_pool_count时才会被认为是有效的。
4、常量池数据区(constant_pool[contstant_pool_count-1])
常量池,constant_pool是一种表结构,它包含 Class 文件结构及其子结构中引用的所有字符串常量、 类或接口名、字段名和其它常量。 常量池中的每一项都具备相同的格式特征——第一个字节作为类型标记用于识别该项是哪种类型的常量,称为 “tag byte” 。常量池的索引范围是 1 至constant_pool_count−1。常量池的具体细节我们会稍后讨论。
5、访问标志(access_flags)
访问标志,access_flags是一种掩码标志,用于表示某个类或者接口的访问权限及其基础属性
6..类索引(this_class)
类索引,this_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的类或接口。
7、父类索引(super_class)
父类索引,对于类来说,super_class 的值必须为 0 或者是对constant_pool 表中项目的一个有效索引值。如果它的值不为 0,那 constant_pool 表在这个索引处的项必须为CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的类的直接父类。当前类的直接父类,以及它所有间接父类的access_flag 中都不能带有ACC_FINAL 标记。对于接口来说,它的Class文件的super_class项的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为代表 java.lang.Object 的 CONSTANT_Class_info 类型常量 。如果 Class 文件的 super_class的值为 0,那这个Class文件只可能是定义的是java.lang.Object类,只有它是唯一没有父类的类。
8、 接口计数器(interfaces_count)
接口计数器,interfaces_count的值表示当前类或接口的直接父接口数量。
9.接口信息数据区(interfaces[interfaces_count])
接口表,interfaces[]数组中的每个成员的值必须是一个对constant_pool表中项目的一个有效索引值, 它的长度为 interfaces_count。每个成员 interfaces[i] 必须为 CONSTANT_Class_info类型常量,其中 0 ≤ i