从今天开始分几节介绍Java中最重要的class文件。
包括class文件的结构、class是如何进入到虚拟机中的(类装载)、class的消亡(垃圾收集)
Class 的结构
Class 文件由 java 代码编译而来,每个类都会生成一个 .class 文件。 Java class 文件中包含了 java 虚拟机所需知道的、关于类或接口的所有信息。这些信息用表格的形式来说明,我们可以得到 classfile 表:如图 1
图 1 classfile 表的格式
其中类型或者为表名,或者如表 1 所示的“基本类型”。所有存储在类型 u2 、 u4 和 u8 中的值,在 class 文件中以高位在前的形式出现。
U1
|
1 个字节,无符号整形
|
U2
|
1 个字节,无符号整形
|
U3
|
1 个字节,无符号整形
|
U4
|
1 个字节,无符号整形
|
表 1 class 文件“基本类型”
Classfile 表中各项简介如下:
1) Magic( 魔数 )
每个 java class 文件的前 4 个字节被称为 magic number : 0xCAFEBABE 。魔数的作用在于,可以轻松的分辨出 java class 文件和非 java class 文件。
Class 文件的下面 4 个字节包含了主次版本号。随着 java 技术的发展, java class 文件格式可能会加入新特性。 Class 文件格式一旦发生变化,版本号也会随之变化。如果 class 文件的版本号超出了 java 虚拟机所能处理的有效范围, java 虚拟机将不会处理该文件。
之后的是常量池。其中包含了与文件中类和接口相关的常量。常量池中存储了诸如文字字符串、 final 变量值、类名和方法名的常量。 Java 虚拟机把常量池组织为入口列表的形式。在实际列表 constant_pool 之前,是入口在列表中的计数 constant_pool_count 。
常量池中的许多入口都指向其他的常量池入口,而且 class 文件中紧随着常量池的许多条目也会指向常量池中的入口。在整个 class 文件中,指示常量池入口在常量池列表中位置的整数索引都指向这些常量池入口。列表中的一项索引值为 1 ,第二项索引值为 2 ,以此类推。
例: act.class 的常量池。
“ { }V ”表示一个返回类型为 void 的方法。
访问标志。这个字段表示的意思指明了文件中定义的是类还是接口;还定义了在类或接口的声明中,使用了哪种修饰符:是抽象的还是公共的,或者是 final 。类的类型可以为 final ,而 final 类不可能是抽象的,同时接口也不能为 final 类型。
这个类的名字和超类名字。特殊的,对于 object 类, super_class 为 0 ,除此以外 super_class 对于所有的类均有效。对于接口,在常量池入口 super_class 位置的项为 java.lang.object
。
紧接着 super_class 的是 Interfaces_count 。此项的含义为:在文件中由该类直接实现或者由该接口所扩展的父接口的数量。在这个技术的后面,是名为 interfaces 的数组,它包含了对每个由由该类直接实现或者由该接口所扩展的父接口的常量池索引。