2004-10-22
第四章:class文件格式
java.io.DataInput和java.io.Output輸入輸出的都是以高端字節序輸出字節。
與C結構的域不同,class文件中連續的項順序存儲,不進行填充或者對齊。
4.1classFile
一個class文件包含一個單獨的classFile結構,包含:
一個四字節的幻數表明class類型。具有值0XCAFEBABE;
access_flag用于表明是類還是接口,是abstract,final還是其他
另外分別有表存儲:常量、屬性、方法、域。
目前屬性只有sourceFile屬性。
4。2完全限定類名稱的內部形式
出現在classFile文件結構中的類都以完全限定類名稱的方式出現,并且不是類似于java.lang.xxx,而是變為java/lang/xxx
4.3描述符
域類型有:根類型,對象類型,數組類型
根類型有:B,C,D,F,I,J,S,Z
對象類型:L
數組類型:[
多維數組double[][][] d的表示方式:[[[D
方法返回描述符
V表示void
object mymethod(int i,double j,Thread t)的方法描述符為:
(IDLjava/lang/Thread;)Ljava/lang/Object;
java的方法不管是static還是實例方法描述符都是如此,區別在于jvm運行時給實例方法隱式的傳遞當前對象的指針this
4.4常數池
常數池由一組類似于cp_info的結構構成
cp_info{
?u1 tag;
?u1 info[];
}
4.5域
每個域由一個變長的field_info構成
field_info{
?u2 access_flags;
?u2 name_index;
?u2 descriptor_index;
?u2 attribute_count;
?attribute_info attributes[attributes_count];
}
4.6方法
每個方法由變長結構method_info構成
method_info{
?u2 access_flags;
?u2 name_index;
?u2 descriptor_index;
?u2 attribute_count;
?attribute_info attributes[attributes_count];
}
4.7屬性
屬性用于field_info,method_info,class_file結構之中,結構一般如下:
attribute_info{
?u2 attribute_name_index;
?u4 attribute_length;
?u1 info[attribute_length];
}
某些屬性被預定義作為class文件規范的一部分,這些屬性是:sourceFile,ConstantValue,code,exception,lineNumberTable和localVariableTable屬性。
4。8對java虛擬機代碼的約束
4。9class文件的檢驗
4。10java虛擬機和class文件格式的限制