1、 java class文件是什么?
Java class文件是对java程序二进制文件格式的精确定义,每一个java class文件都对一个java类或者java接口作出了全面描述。
一个class文件只能包含一个类或者接口。
无论java class文件在何种系统上产生,无论虚拟机在何种系统上运行,对java class文件来的精确定义使得所有java虚拟机都能够正确的读取和解释所有java class文件。
2、 class文件的内容
java class文件中包含了java虚拟机所需要知道的、关于类或者接口的所有信息。
Magic:每个java class文件的前4个字节被称为它的魔数:0xCAFEBABE。魔数用来区分是否class文件。
Minor_version和major_version:class文件的下面4个字段包含了主、次版本号。
Constant_pool_count和constant_pool:在class文件中,魔数和版本号后面的是常量池。
Access_flags:紧接常量池后的两个字节称为access_flags,它展示了文件中定义的类或者接口的几段信息。例如,访问标志指明文件中定义的是类还是接口;访问标志还定义了在类或接口的声明中,使用了哪种修饰符;类和接口是抽象的,还是公共的。
This_class:接下来的两个字节为this_class项,它是一个对常量池的索引。在this_class位置的常量池入口必须为constant_class_info表。该表由标签和name_index两个部分组成,标签部分是一个具有constant_class值的常量,在name_index位置的常量池入口为一个包含了类或者接口全限定名的constant_utf8_info表。
Super_class:在class文件中,紧接在this_class之后的是super_class项,它是一个两个字节的常量池索引。在super_class位置的常量池入口是一个指向该类超类全限定名的constant_class_info入口。
Interfaces_count和interfaces:紧接着super_class的是interfaces_count。此项的含义为:在文件中由该类直接实现或者由接口所扩展的父的接口的数量。在这个计数的后面是名为interfaces的数组,它包含了对每个由该类或者接口直接实现的父接口的常量池索引。
Fields_count和fields:在class文件中,紧接在interfaces后面的是对在该类或者接口中所声明的字段的描述。首先是名为fields_count的计数,它是类变量和实例变量的字段的数量总和。在这个计数后面的是不同长度的field_info表的序列。只有在文件中由类或者接口声明了的字段才能在fields列表中列出。另一方面,fields列表可能会包含在对应的java源文件中没有叙述的字段,这是因为java编译器可能会在编译时向类或者接口添加字段。
Methods_count和methods:在class文件中,紧接着fields后面的是对在该类或者接口中所声明的方法的描述。首先是名为methods_count的计数,它是一个双字节长度的对于该类或接口中声明的所有方法的总计数。
Attributes_count和attributes:class文件中最后的部分是属性,它给出了在该文件中类或者接口所定义的属性的基本信息。
待续......