每個 Class 文件對應一個類/接口,但類不一定生成 Class 文件(如動態代理)。結構順序固定:
魔數(4B) → 版本號(4B) → 常量池 → 訪問標志(2B) → 類/父類/接口索引 → 字段表集合 → 方法表集合 → 屬性表集合
0xCAFEBABE(咖啡寶貝),標識 Class 文件格式constant_pool_count(從 1 開始,0 保留)tag 標識類型(UTF-8、Integer、Class、Methodref 等)識別類/接口層級訪問權限(public、final、abstract、interface 等)。
this_class:指向常量池 CONSTANT_Class_info,確定當前類全限定名super_class:父類索引(Object 除外均非 0)interfaces:實現接口索引集合,順序按 implements 聲明描述類/實例變量(不含局部變量):
name_index:簡單名稱(如 name)descriptor_index:描述符(如 Ljava/lang/String;、[[I)ConstantValue(final 常量值)、註解等結構類似字段表,描述符包含參數列表與返回值:
int getIndex(String[] arr, String ele) → 描述符:([Ljava/lang/String;Ljava/lang/String;)I
Code:方法字節碼、操作數棧、局部變量表Exceptions:拋出異常列表LineNumberTable/LocalVariableTable:調試信息SourceFile/EnclosingMethod:源碼關聯| 類型 | 描述符 |
|---|---|
| boolean | Z |
| byte | B |
| char | C |
| short | S |
| int | I |
| float | F |
| long | J |
| double | D |
| 引用類型 | L全限定名; |
| 數組 | [描述符 |
掌握 Class 文件結構是理解 JVM 類加載、字節碼操作、框架原理的基石。