Java基础知识之Class结构

来源:互联网 发布:linux grep命令 递归 编辑:程序博客网 时间:2024/06/15 23:01

每一个Class文件都对应着唯一一个类或接口的定义信息,但是相对地,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。

每个Class文件都是由8字节为单位的字节流组成,所有的16位、32位和64位长度的数据将被构造成 2个、4个和8个8字节单位来表示。

多字节数据项总是按照Big-Endian的顺序进行存储。

在Java SDK中,访问这种格式的数据可以使用java.io.DataInput、java.io.DataOutput等接口和java.io.DataInputStream 和java.io.DataOutputStream等类来实现。

在Java SDK中这些类型的数据可以通过实现接口java.io.DataInput 中的readUnsignedByte、readUnsignedShort和readInt方法进行读取。

u1,u2,u4分别代表了1,2,4个字节的无符号书。

1 ClassFile文件

每一个ClassFile都对应着一个结构体

ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count];u2 methods_count; method_info methods[methods_count];u2 attributes_count; attribute_info attributes[attributes_count]; }

 

magic:确定这个是否被虚拟机所接受的Class文件。魔数值固定为0xCAFEBABE,不会改变。

minor_version,major_version:表示Class文件的副、主版本。

constant_pool_count:常量池计数器,constant_pool_count的值等于constant_pool表中的成员数加1。constant_pool表的索引值只有在大于0且小于constant_pool_count时才会  被认为是有效的②。

constant_pool:常量池主要存放两大类常量:字面量和符号引用。常量池,constant_pool是一种表结构(§4.4),它包含Class文件结构及其子结构中引用的所有字符串常量、类或接口名、字段名和其它常量。常量池中的每一项都具备相同的格式特征——第一个字节作为类型标记用于识别该项是哪种类型的常量,称为“tag byte”。常量池的索引范围是1至constant_pool_count−1。

符号引用:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。

access_flags:访问标志,是一种掩码,用来表示一种类或者接口的访问权限和基础属性。

this_class:类索引,this_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info类型常量。

super_class:父类索引,对于类来说,super_class的值必须为0或者是对constant_pool表中项目的一个有效索引值。

interfaces_count 接口计数器,interfaces_count的值表示当前类或接口的直接父接口数量。

fields_count:字段计数器,fields_count的值表示当前Class文件fields[]数组的成员个数。fields[]数组中每一项都是一个field_info结构(§4.5)的数据项,它用于表示该类或接口声明的类字段或者实例字段

fields[]: 字段表,fields[]数组中的每个成员都必须是一个fields_info结构(§4.5)的数据项,用于表示当前类或接口中某个字段的完整描述。fields[]数组描述当前类或接口声明的所有字段,但不包括从父类或父接口继承的部分。

methods_count :方法计数器,methods_count的值表示当前Class文件methods[]数组的成员个数。Methods[]数组中每一项都是一个method_info结构(§4.5)的数据项

methods[]:方法表,methods[]数组中的每个成员都必须是一个method_info结构(§4.6)的数据项,用于表示当前类或接口中某个方法的完整描述。

attributes_count 属性计数器,attributes_count的值表示当前Class文件attributes表的成员个数。

attributes[] 属性表,attributes表的每个项的值必须是attribute_info结构(§4.7)。在本规范里,Class文件结构中的attributes表的项包括下列定义的属性:

 

 

 

 

 

 


 


 

 

0 0
原创粉丝点击