class檔案結構[4]
【參考連結】
通過gclasslib來粗略講解一下.class檔案的整體結構
整體結構如下所示
以如下原始碼為例
Java Code
1 |
package com.test.a; int v1=0; try{ this.m1=arg1; }catch(IllegalStateException e){ System.out.println(e.toString()); } } } |
magic
前4個位元組稱為magic(魔數),統一為0xCAFEBABE(諧音cafe baby)。
version
接下來4個位元組為minor version和majorversion
constant pool
常量池前面已經詳細講過,這裡不在敘述
access_flags
標誌名 |
標誌值 |
標誌含義 |
適用物件 |
ACC_PUBLIC |
0x0001 0000 0000 0000 0001 |
public型別 |
類、介面、列舉、註解 |
ACC_FINAL |
0x0010 0000 0000 0001 0000 |
final型別 |
類 |
ACC_SUPER |
0x0020 0000 0000 0010 0000 |
使用新的invokespecial語義 |
類、介面 |
ACC_INTERFACE |
0x0200 0000 0010 0000 0000 |
介面型別 |
介面 |
ACC_ABSTRACT |
0x0400 |
abstract |
類、介面 |
ACC_SYNTHETIC |
0x1000 |
該類不由使用者程式碼生成 |
類、介面、列舉、註解 |
ACC_ANNOTATION |
0x2000 |
註解型別 |
註解 |
ACC_ENUM |
0x4000 |
列舉型別 |
列舉 |
this
super
interfaces
fields
m1
m2
methods
<init>
method1
attributes
通用
Deprecated
以Class上的Deprecated屬性為例
Synthetic
Class
SourceFile
InnerClasses
Field
ConstantValue
如前文所述,static final型別常量會有ConstantValue屬性,用於在準備階段設定值
Method
以method1()方法為例
Exceptions
這個Exceptions屬性是在方法上throw的,下面的是在方法中try/catch/throw的
Code
Minor version應該是Maxinum stack depth,表示運算元棧的最大深度是3
Maximum local variables表示區域性變量表佔用的總空間大小是5 個槽位
位元組碼指令如下
方法中的異常表如下
Code屬性還還含有子屬性,用於進一步儲存一些額外資訊
LineNumberTable
用於記錄位元組碼指令的偏移量和行號之間的對應關係
LocalVariableTable
區域性變量表,共有4個形式引數+區域性變數
index表示區域性變數佔用的槽位的位置
其中double型別arg1佔用的是1~2槽位,其餘各佔1個槽位。共5個槽位,跟Code中的Maximum local variables一致