定義:u1 1個字節(jié)為單位的非負值 u2 2個字節(jié)為單位的非負值 u3 . . . . . . . . (其他以此類推 ) Java 文件 結(jié)構(gòu) 用類似struct的描述如下: ClassFile { u4 magic; // 必須為: 0xCAFEBABE u2 minor_version; u2 major_version; //CLASS 文件 結(jié)構(gòu) 主次版本號 JA
定義:u11個字節(jié)為單位的非負值
u2
2個字節(jié)為單位的非負值
u3
. . . . . . . .
(其他以此類推 )
Java文件結(jié)構(gòu)用類似struct的描述如下:
ClassFile {
u4 magic;
// 必須為: 0xCAFEBABE
u2 minor_version;
u2 major_version;
//CLASS文件結(jié)構(gòu)主次版本號 JAVA2支持45.0-46.
0
u2 constant_pool_count; //記錄常量信息
cp_info constant_pool[constant_pool_count-1];
//計數(shù)從1開始
u2 access_flags;
//class/interface訪問權(quán)限
u2 this_class;
//指向constant_poll中的有效索引值
u2 super_class;
//0或指向constant_poll中的有效索引值,對于in
terface必須為非0
u2 interfaces_count;
//superinterfaces的個數(shù)
u2 interfaces[interfaces_count];
//計數(shù)[0,count-1) 對應(yīng)constant_po
ol中的一個索引值
u2 fields_count;
field_info fields[fields_count];
//主要用于記錄class及實例中的變量
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
cp_info {
u1 tag;
u1 info[];
}
tag 意義如下:
CONSTANT_Class
7
CONSTANT_Fieldref
9
CONSTANT_Methodref
10
CONSTANT_InterfaceMethodref
11
CONSTANT_String
8
CONSTANT_Integer
3
CONSTANT_Float
4
CONSTANT_Long
5
CONSTANT_Double
6
CONSTANT_NameAndType
12
CONSTANT_Utf8
1
此時cp_info分別對應(yīng)結(jié)構(gòu)變化為
1. CONSTANT_Class
CONSTANT_Class_info {
u1 tag;
u2 name_index;
}
2. CONSTANT_Fieldref
CONSTANT_Fieldref_info {
u1 tag;
u2 class_index;
//constant_pool的索引,對應(yīng)CONSTANT_Class_
info
u2 name_and_type_index;//constant_pool的索引,對應(yīng)CONSTANT_
NameAndType_info
}
3. CONSTANT_Methodref
CONSTANT_Methodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
4. CONSTANT_InterfaceMethodref
CONSTANT_InterfaceMethodref_info {
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
5. CONSTANT_String
CONSTANT_String_info {
u1 tag;
u2 string_index;
}
6. CONSTANT_Integer
CONSTANT_Integer_info {
u1 tag;
u4 bytes;
}
7. CONSTANT_Float
CONSTANT_Float_info {
u1 tag;
u4 bytes;
}
8. CONSTANT_Long
CONSTANT_Long_info {
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
9. CONSTANT_Double
CONSTANT_Double_info {
u1 tag;
u4 high_bytes;
u4 low_bytes
}
10.CONSTANT_NameAndType
CONSTANT_NameAndType_info {
u1 tag;
u2 name_index;
u2 descriptor_index;
}
11.CONSTANT_Utf8
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
access_flags意義如下:
ACC_PUBLIC
0x0001
ACC_FINAL
0x0010
ACC_SUPER
0x0020
ACC_INTERFACE
0x0200
ACC_ABSTRACT
0x0400
如果是interface那么必須置ACC_INTERFACE,如果沒有置ACC_INTERFACE則定義的是一
個類而非接口。
如果設(shè)置了ACC_INTERFACE,那么ACC_ABSTRACT位也必須被設(shè)置,當然也可以設(shè)置AC
C_PUBLIC。
ACC_SUPER用以表明invokespecial語義,Sun公司老的JAVA編譯器沒有設(shè)置ACC_SUPER
,并且老的JVM
忽略ACC_SUPER位,但新的編譯器應(yīng)該實現(xiàn)invokespecial語義。
其他未指明的位保留將來使用,并且編譯器應(yīng)當將其置為0,同時Java虛擬機應(yīng)當忽
略他們。
this_class:
constant_pool中的索引值,指向的元素的cp_info等價為CONSTANT_Class
_info
CONSTANT_Class_info {
u1 tag;
//必須為CONSTANT_Class (7)
u2 name_index;
//為指向constant_pool中的一個索引值
}
name_index :指向的元素的cp_info等價為CONSTANT_Utf8_info
CONSTANT_Utf8_info {
u1 tag;
//必須為CONSTANT_Utf8 (1)
u2 length;
u1 bytes[length];
//Utf8編碼的字符串
}
field_info {
u2 access_flags;
//訪問控制權(quán)
u2 name_index;
//constant_pool中的索引,對應(yīng)于CONSTANT_Utf8_inf
o描述。
u2 descriptor_index; //constant_pool中的索引,對應(yīng)于CONSTANT_Utf8_i
nfo描述。
u2 attributes_count;
attribute_info attributes[attributes_count]; //attribute_info將在mo
thods后描述。
}
field_info中access_flages意義如下:
ACC_PUBLIC
0x0001
ACC_PRIVATE
0x0002
ACC_PROTECTED
0x0004
ACC_STATIC
0x0008
ACC_FINAL
0x0010
ACC_VOLATILE
0x0040
ACC_TRANSIENT
0x0080
其中很顯然不能同時為ACC_FINAL和ACC_VOLATILE 且前三項是互斥的。
interface必須置ACC_PUBLIC, ACC_STATIC,ACC_FINAL位,且不能置其他位。
其他未指明的位保留將來使用,并且編譯器應(yīng)當將其置為0,同時Java虛擬機應(yīng)
當忽略他們。
methods指明了類中的所有方法。
method_info {
u2 access_flags;
u2 name_index;
//指向constant_pool的入口,對應(yīng)為CONSTANT_
Utf8_info
u2 descriptor_index;
//指向constant_pool的入口,對應(yīng)為CONS
TANT_Utf8_info
u2 attributes_count;
attribute_info attributes[attributes_count];
//此處只能出現(xiàn)Code、Exceptions、Synthetic、Deprecated四種類
型的屬性
}
access_flags訪問權(quán)描述如下:
ACC_PUBLIC
0x0001
ACC_PRIVATE
0x0002
ACC_PROTECTED
0x0004
ACC_STATIC
0x0008
ACC_FINAL
0x0010
ACC_SYNCHRONIZED
0x0020
ACC_NATIVE
0x0100
ACC_ABSTRACT
0x0400
ACC_STRICT
0x0800
attribute_info {
u2 attribute_name_index;
//constant_pool中的索引,對應(yīng)于CONSTANT_U
tf8_info描述。
u4 attribute_length;
u1 info[attribute_length];
}
現(xiàn)在已經(jīng)預定義的屬性有:
1. SourceFile : attribute_info被替代為:
SourceFile_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 sourcefile_index; //指向constant_pool中的一個CONSTANT_Ut
f8_info 結(jié)構(gòu)。
}
2. Constantvalue : attribute_info被替代為:
Constantvalue_attribute {
u2 attribute_name_index;
u4 attribute_length;
//必須為2
u2 constantvalue_index;
}
對于constantvalue_index意義如下:
long
CONSTANT_Long
float
CONSTANT_Float
double
CONSTANT_Double
int, short, char, byte, boolean
CONSTANT_Integer
String
CONSTANT_String
Constantvalue用于field_info 中,用于描述一個static常量,
且此時field_info的access_flags應(yīng)為ACC_STATIC
3. Code : attribute_info被替代為:
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
//執(zhí)行此函數(shù)時可用的棧的最大深度
u2 max_locals; //執(zhí)行此函數(shù)可用到的最大本地變量數(shù)目,包括參
數(shù)。
// 注意:一個long/double相當于2個變量數(shù)目.
u4 code_length; //本函數(shù)用到的代碼長度。
u1 code[code_length]; //實現(xiàn)本函數(shù)的真正字節(jié)碼
u2 exception_table_length;
{
u2 start_pc;
u2 end_pc; //捕獲違例時執(zhí)行代碼數(shù)組中的[start_pc, end_p
c)部分
u2
handler_pc; //現(xiàn)在還不大明白他是干嘛的!!
u2
catch_type; //指向constant_pool的索引,對應(yīng)CONSTANT
_Class_info
}exception_table[exception_table_length];
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com