ClassFile表的格式
類 型 |
名 稱 |
數 量 |
u4 |
magic |
1 |
u2 |
minor_version |
1 |
u2 |
major_version |
1 |
u2 |
constant_pool_count |
1 |
cp_info |
constant_pool |
constant_pool_count-1 |
u2 |
access_flags |
1 |
u2 |
this_class |
1 |
u2 |
super_class |
1 |
u2 |
interfaces_count |
1 |
u2 |
interfaces |
interfaces_count |
u2 |
fields_count |
1 |
field_info |
fields |
fields_count |
u2 |
methods_count |
1 |
method_info |
methods |
methods_count |
u2 |
attributes_count |
1 |
attribute_info |
attributes |
attributes_count |
常量池標誌
入 口 類 型 |
標 志 值 |
描 述 |
CONSTANT_Utf8 |
1 |
UTF-8編碼的Unicode字符串 |
CONSTANT_Integer |
3 |
int類型字面值 |
CONSTANT_Float |
4 |
float類型字面值 |
CONSTANT_Long |
5 |
long類型字面值 |
CONSTANT_Double |
6 |
double類型字面值 |
CONSTANT_Class |
7 |
對一個類或接口的符號引用 |
CONSTANT_String |
8 |
String類型字面值 |
CONSTANT_Fieldref |
9 |
對一個字段的符號引用 |
CONSTANT_Methodref |
10 |
對一個類中聲明的方法的符號引用 |
CONSTANT_InterfaceMethodref |
11 |
對一個接口中聲明的方法的符號引用 |
CONSTANT_NameAndType |
12 |
對一個字段或方法的部分符號引用 |
- 類和接口的全限定名
- 字段的名稱和描述符
- 方法的名稱和描述符
access_flags項的標誌位
標 志 名 |
值 |
設置後的含義 |
設 置 者 |
ACC_PUBLIC |
0x0001 |
public類型 |
類和接口 |
ACC_FINAL |
0x0010 |
類爲final類型 |
只有類 |
ACC_SUPER |
0x0020 |
使用新型的invokespecial語義 |
類和接口 |
ACC_INTERFACE |
0x0200 |
接口類型,不是類類型 |
所有的接口,沒有類 |
ACC_ABSTRACT |
0x0400 |
abstract類型 |
所有的接口,部分類 |
基本類型終結符
終 結 符 |
類 型 |
B |
byte |
C |
char |
D |
double |
F |
float |
I |
int |
J |
long |
S |
short |
Z |
boolean |
字段描述符示例
描 述 符 |
字 段 聲 明 |
I |
int i; |
[[J |
long[][] windingRoad; |
[Ljava/lang/Object; |
java.lang.Object[] stuff; |
Ljava/util/Hashtable; |
java.util.Hashtable ht; |
[[[Z |
boolean[][][] isReady; |
方法描述符示例
描 述 符 |
方 法 聲 明 |
()I |
int getSize(); |
()Ljava/lang/String; |
String toString(); |
([Ljava/lang/String;)V |
void main(String[] args); |
()V |
void wait(); |
(JI)V |
void wait(long timeout, int nanos); |
(ZILjava/lang/String;II)Z |
boolean regionMatches(boolean ignoreCase, int toOffset, String other, int offset, int len); |
([BII)I |
int read(byte[] b, int off, int len); |
cp_info表的通常形式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
表的類型和格式 |
u1 |
info |
根據tag值決定 |
|
- 文字字符串,如String對象。
- 被定義的類和接口的全限定名。
- 被定義的類的超類(如果有的話)的全限定名。
- 被定義的類和接口的父接口的全限定名。
- 由類或者接口聲明的任意字段的簡單名稱和描述符。
- 由類或者接口聲明的任意方法的簡單名稱和描述符。
- 任何引用的類和接口的全限定名。
- 任何引用的字段的簡單名稱和描述符。
- 任何引用的方法的簡單名稱和描述符。
- 與屬性相關的字符串。
名 稱 |
數 量 |
描 述 |
|
u1 |
tag |
1 |
值爲CONSTANT_Utf8(1) |
u2 |
length |
1 |
bytes項的長度(字節數) |
u1 |
bytes |
length |
按照變體UTF-8格式存儲的字符串中的字符 |
CONSTANT_Integer_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Integer(3) |
u4 |
bytes |
1 |
按照高位在前的格式存儲int類型值 |
CONSTANT_Float_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Float(4) |
u4 |
bytes |
1 |
按照高位在前的格式存儲float類型值 |
CONSTANT_Long_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Long(5) |
u8 |
bytes |
1 |
按照高位在前的格式存儲long類型值 |
CONSTANT_Double_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Double(6) |
u8 |
bytes |
1 |
按照高位在前的格式存儲double類型值 |
CONSTANT_Class_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Class(7) |
u2 |
name_index |
1 |
包含類或者接口全限定名的CONSTANT_Utf8_info表的索引 |
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_String(8) |
u2 |
string_index |
1 |
包含文字字符串值的CONSTANT_Utf8_info表的索引 |
CONSTANT_Fieldref_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Fieldref(9) |
u2 |
class_index |
1 |
聲明被引用字段的類或者接口的CONSTANT_Class_info入口的索引 |
u2 |
name_and_type_index |
1 |
提供了CONSTANT_NameAndType_info入口的索引,該入口提供了字段的簡單名稱以及描述符 |
CONSTANT_Methodref_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_Methodref(10) |
u2 |
class_index |
1 |
聲明被引用方法的類的CONSTANT_Class_info入口的索引 |
u2 |
name_and_type_index |
1 |
提供了CONSTANT_NameAndType_info入口的索引,該入口提供了方法的簡單名稱以及描述符 |
CONSTANT_InterfaceMethodref_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_InterfaceMethodref(11) |
u2 |
class_index |
1 |
聲明被引用方法的接口的CONSTANT_Class_info入口的索引 |
u2 |
name_and_type_index |
1 |
提供了CONSTANT_NameAndType_info入口的索引,該入口提供了方法的簡單名稱以及描述符 |
CONSTANT_NameAndType_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u1 |
tag |
1 |
值爲CONSTANT_NameAndType(12) |
u2 |
name_index |
1 |
給出了CONSTANT_Utf8_info入口的索引,該入口給出了字段或者方法的名稱 |
u2 |
descriptor_index |
1 |
提供了CONSTANT_Utf8_info入口的索引,該入口提供了字段或者方法的描述符 |
field_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u2 |
access_flags |
1 |
見下方的表 |
u2 |
name_index |
1 |
提供了給出字段簡單名稱(不是全限定名)的CONSTANT_Utf8_info入口的索引 |
u2 |
descriptor_index |
1 |
提供了給出字段描述符的CONSTANT_Utf8_info入口的索引 |
u2 |
atrributes_count |
1 |
attributes_count指出列表中attribute_info表的數量 |
attribute_info |
atrributes |
atrributes_count |
由多個attribute_info表組成的列表 |
field_info表中access_flags項的標誌
標 志 名 稱 |
值 |
設 定 含 義 |
設 定 者 |
ACC_PUBLIC |
0x0001 |
字段設爲public |
類和接口 |
ACC_PRIVATE |
0x0002 |
字段設爲private |
只有類 |
ACC_PROTECTED |
0x0004 |
字段設爲protected |
只有類 |
ACC_STATIC |
0x0008 |
字段設爲static |
類和接口 |
ACC_FINAL |
0x0010 |
字段設爲final |
類和接口 |
ACC_VOLATILE |
0x0040 |
字段設爲volatile |
只有類 |
ACC_TRANSIENT |
0x0080 |
字段設爲transient |
只有類 |
method_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u2 |
access_flags |
1 |
見下方的表 |
u2 |
name_index |
1 |
提供了給出方法簡單名稱(不是全限定名)的CONSTANT_Utf8_info入口的索引 |
u2 |
descriptor_index |
1 |
提供了給出方法描述符的CONSTANT_Utf8_info入口的索引 |
u2 |
atrributes_count |
1 |
attributes_count指出列表中attribute_info表的數量 |
attribute_info |
atrributes |
atrributes_count |
由多個attribute_info表組成的列表 |
method_info表中access_flags項的標誌
標 志 名 稱 |
值 |
設 定 含 義 |
設 定 者 |
ACC_PUBLIC |
0x0001 |
方法設爲public |
類和所有的接口方法 |
ACC_PRIVATE |
0x0002 |
方法設爲private |
只有類 |
ACC_PROTECTED |
0x0004 |
方法設爲protected |
只有類 |
ACC_STATIC |
0x0008 |
方法設爲static |
只有類 |
ACC_FINAL |
0x0010 |
方法設爲final |
只有類 |
ACC_SYNCHRONIZED |
0x0020 |
方法設爲synchronized |
只有類 |
ACC_NATIVE |
0x0100 |
只有類 |
|
ACC_ABSTRACT |
0x0400 |
方法設爲abstract |
類和所有的接口方法 |
ACC_STRICT |
0x0800 |
方法設爲strictFP |
類和接口的<clinit>方法 |
由規範定義的attribute_info表的類型
名 稱 |
使 用 者 |
描 述 |
Code |
method_info |
方法的字節碼和其他數據 |
ConstantValue |
field_info |
final變量的值 |
Deprecated |
field_info、method_info |
字段或者方法被禁用的指示符 |
Exceptions |
method_info |
方法可能拋出的可被檢測的異常 |
InnerClasses |
ClassFile |
內部、外部類的列表 |
LineNumberTable |
Code_attribute |
方法的行號與字節碼的映射 |
LocalVariableTable |
Code_attribute |
方法的局部變量的描述 |
SourceFile |
ClassFile |
源文件名 |
Synthetic |
field_info、method_info |
編譯器產生的字段或者方法的指示符 |
attribute_info表的格式
類 型 |
名 稱 |
數 量 |
描 述 |
u2 |
attribute_name_index |
1 |
給出了包含屬性名稱的CONSTANT_Utf8入口的常量池中的索引 |
u4 |
attribute_length |
1 |
給出了屬性數據的長度(以字節計) |
u1 |
info |
attribute_length |
包含屬性數據 |
- 一個class文件中只能包含一個類或者接口
- 儘管class文件與Java語言結構相關,但它並不一定必須與Java語言相關
- Java class文件是8位字節的二進制流
- 數據項按順序存儲
- 文件緊湊
- 多字節的項按照高位在前的格式存儲
- 常量池至關重要,包含了與class文件中類和接口相關的常量