從今天開始分幾節介紹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 的數組,它包含了對每個由由該類直接實現或者由該接口所擴展的父接口的常量池索引。