在编写好了程序之后,就会出现一个.java结尾的文件,这个是源文件。
而后Java编译器(Javac)编译这个源文件后,生成一个.class文件。这个是类文件。Java的口号是“一次编写,到处运行”,这个是通过JVM来完成的。JVM与.java文件关系不大,与.class文件有着密切的关系。
这个class是八位字节为单位的二进制流,中间没有分隔符,内容按照位置放好,就好像计算机网络中的帧一样每个位置的数字都有自己的意义。
01.魔数 头四个字节,表示这个class文件是不是JVM可以接收的class文件,Java的class文件魔数是0xCAFFBABE (咖啡宝贝),这代表是Java的class文件。
02.版本信息 从第五到第八个字节,第五第六个字节是次要版本,第七第八是主要版本。JDK1.1 主版本是45,从后依次加一。当前的JDK主版本是57。
03.常量池 常量池的结构和广义表(数据结构)很像,常量池开头是两个字节,表示常量池中的个数。后面就是常量池中的项,每项前面有一个字节表示相关项是什么类型的,共有十七种。每种的结构是不同的。
04.访问标志 访问标志包含两个字节,共有16位。只用了9位。用每位上的0或者1值来记录class的信息,比如是否是接口,修饰符是否为public。如果信息需要整合,使用|运算(按位进行或运算)。
05.类索引和接口 前两个字节表示this,类本身。后面俩个字节表示super,(这个是一个关键字,跟this不同),表示是父类。这两个项的值都指向常量池中的项。接口表,跟常量池结构相似。前面的两个字节表示接口的数量,后面的相关项表示接口的相关信息。
06.字段表 用于描述类或者接口中的变量信息。跟广义表结构相似。前两个字节表示字段表中的字段个数,后面的项表示字段。每个项的结构是一致的。项中前两个字节表示修饰符,后面四个字节,前二表示指向常量池中的相关变量的变量名,后面指向的常量池中的相关变量的方法和字段描述符(变量的数据类型,参数列表(数量,类型,顺序),返回值)
07.方法表 跟字段表中的结构几乎是一样的,用来描述类class文件中存储的方法。前二是class文件中方法的数量,后面的项,前二表示修饰符,三四表示指向的方法名,五六表示数据类型,参数的信息,返回值。
08.属性表集合 这个是字段表,方法表中都可以含有的。这个还没有学完,相关百度。