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文件格式的限制