java class文件中包含了java虚拟机所需知道的、关于类或者接口的所有信息。
class文件“基本类型”
u1----1个字节 u2-----2个字节 u4----4个字节 u8----8个字节
ClassFile表中各项:
1)magic(魔数)
每个java class文件的前4个字节被称为他的魔数(magic number): 0xCAFEBABE
作用:可以轻松地分辩出Java class文件和非java class文件。(如果一个文件不是以0xCAFEBABE开头,他就肯定不是Java class文件)
*文件格式定义者能够自由选择魔数,前提是这个选定的魔数值没有被广泛应用。
2)minor_version和major_version
class文件的下面4个字节包含了主、版本号。通常只有给定主版本号和一系列次版本号后,java虚拟机才能够读取class文件。
如果class文件的版本号超出了java虚拟机所能够处理的有效范围,java虚拟机将不会处理该class文件。
3)constant_pool.count和constant_pool
在class文件中,魔数和版本号后面的是常量池。常量池包含了与文件中类和接口相关的常量。常量池中存储了诸如文字字符串、
final变量值、类名和方法名的常量。
在动态连接的java程序中,常量池充当了十分重要的角色:
字面常量、类和接口的全限定名、字段的名称和描叙符、方法的名称和描叙符
4)access_flegs
紧接常量池后的两个字节称为access_flags,他展示了文件中定义的类或接口的几端信息。
例如,访问标志指明文件中定义的是类还是接口;访问标志还定义了在类或接口的声明中,使用了哪些修饰符;类和接口是抽象的
还是公共的;类的类型可以是final,而final类不可能是抽象的;接口不能是final类型
5)this_class
接下来的两个字节为this_class项,他是一个对常量池的索引。在this_class位置的常量池入口必须为CONSTANT_Class_info表。
该表由两个部分组成----标签和name_index
标签部分是一个具有CONSTANT_Class值的常量
name_index位置的常量池入口为一个包含子类或接口全限定名的CONSTANT_Utf8_info表。
6)super_class
在class文件中紧接在this_class之后的是super_class项,它是一个两个字节的常量池索引。在supper_class位置的常量池
入口是一个指向该类超类全限定名的CONSTANT_Class_info入口。
因为java程序中所有对象的基类都是java.lang.Object类,除了Object类之外,常量池入口super_class位置的项为java.lang.Object
7)interfaces_count和interfaces
紧接着super_class的是interfaces_count,此项的含义是:在文件中由该类直接实现或者由接口所扩展的父借口的数量。
8)fields_count和fields
在class文件中,紧接在interfaces后面的是对在该类或者接口中所声明的字段的描述
9)methods_count和methods
在class文件中,紧接着fields后面的是对在该类或者接口中所声明的方法的描述。首先是名为methods_count的计数,它是一个
双字节长度的对类或者接口中声明的所有方法的总计数。
10)attributes_count和attributes
class文件中最后的部分是属性(attribute),他给出了在该文件中类或者接口所定义的属性的基本信息。