引導
Class文件的基本結(jié)構(gòu)
Class文件的常量池
Class文件的訪問標志,類索引,父類索引,接口索引
Class文件的字段和方法
Class文件的訪問標志
訪問標志(access_flags) 在常量池(constant_pool)數(shù)組的后面,如下圖紅色框所示。

在 Class文件的基本結(jié)構(gòu) 一文中已經(jīng)簡單的介紹了訪問標志(access_flags),它占 2 個字節(jié),總共 16 位。其每一位代表的信息及各訪問標志值對應(yīng)的排列方式如下圖所示。

- 對于類,JVM 在將其編譯成 class 文件時,會將其低位第 6 位為設(shè)置為1;
- 對于接口,JVM 在將其編譯成 class 文件時,會將其低位第 10 位設(shè)置為1;
- 對于注解,JVM 再將其編譯成 class 文件時,會將其低位第 14 位設(shè)置為1;
- 對于枚舉,JVM 在將其編譯成 class 文件時,會將其低位第 15 位設(shè)置為1;
- 對于訪問權(quán)限為
public的類或接口,JVM 在將其編譯成 class 文件時,會將其低位第 1 位設(shè)置為1; - 對于接口或被
abstract修飾的類,JVM在將其編譯成 class 文件時,會將其低位第 11 位設(shè)置為1; - 對于被
final修飾的類,JVM 在將其編譯成 class 文件時,會將其低位第 5 位設(shè)置為1;
舉個栗子。定義如下代碼。
public final class ClassFile {
}
根據(jù)上面的分析,ClassFile 類被 JVM 編譯成 class 文件后,其訪問標志(access_flags) 應(yīng)該為 ACC_PUBLIC、ACC_FINAL、ACC_SUPER,事實證明確實如此,下圖是 ClassFile 被編譯成的 class 文件。

Class文件的類索引
類索引(this_class)表示當前 class 文件描述的是哪個類。
類索引(this_class) 在訪問標志(access_flags)的后面,如下圖紅色框所示。

類索引(this_class)是一個指向常量池(constant_pool)數(shù)組的有效索引值。
舉個栗子。還是上面所定義的 ClassFile,其類索引及其對應(yīng)的常量池(constant_pool)數(shù)組所在的常量池項如下圖所示。

Class文件的父類索引
父類索引(super_class)表示當前 class 文件描述的類所屬的直接父類。
父類索引(super_class) 在類索引(this_class)的后面,如下圖紅色框所示。

父類索引(super_class)是一個指向常量池(constant_pool)數(shù)組的有效索引值。
舉個栗子。還是上面所定義的 ClassFile,其父類索引及其對應(yīng)的常量池(constant_pool)數(shù)組所在的常量池項如下圖所示。

Class文件的接口索引
接口計數(shù)器(interface_count)和接口索引(interfaces)數(shù)組描述了當前 class 文件描述的類所實現(xiàn)的接口信息。
接口索引在父類索引(super_class)的后面,如下圖紅色框所示。

接口索引(interfaces)數(shù)組的每一項都是一個指向常量池(constant_pool)數(shù)組的有效索引值。
舉個栗子。定義如下代碼。
public class ClassFile implements A, B {
}
interface A {}
interface B {}
