http://caoyaojun1988-163-com.iteye.com/blog/1114420
Java class 文件
1、Class文件是什么:class文件是java程序二进制文件的精确的定义,每一个class的文件都对应一个类或则接口,class文件是JVM真正能读懂的文件格式。
2、Class文件与java的关系:一般的讲class文件由java的类文件编译而来,但是事实上class文件只是定义的一种格式,你甚至可以手动编写二进制文件,只要能满足class文件的定义,就可以由JVM解析,执行。
3、Class 文件概况:1、是由8位字节的二进制流,2、高位在前的形式;3、数据项之间没有间隔,保持文件的紧凑。
4、Class 的文件数据类型:
4.1、 class 文件的基础数据类型
U1 | 1个字节,无符号类型 |
U2 | 2个字节,无符号类型 |
U4 | 4个字节,无符号类型 |
U8 | 8个字节,无符号类型 |
4.2、复合数据类型:复合数据类型是有一个或者多个具有具体定义的基础数据类型或者复合数据类的组成的结构体;可以将复合数据类型分为4类:
4.2.1、 cp_info 类型:cp_info是定义常量池的数据格式,一共有11种具体的格式;通用格式如下:
类型 | 名称 | 数量 |
U1 | Tag | 1 |
U1 | info | 根据tag的值决定 |
(1)、 constant_utf8_info:存储四种基本信息类型,文字字符串,定义的类或者借口的描述,其他类或者接口的符号引用以及属性相关的字符串,具体的格式如下:
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为1;0x 01 |
U2 | Length | 1 | 后续bytes项的长度 |
U? | bytes | length | 变体UTF8格式的数据 |
(2)、 constant_integer_info:int类型的值
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为3;0x 03 |
U4 | bytes | 1 | 高位在前格式的int值 |
(3)、 constant_float_info:float类型的值
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为4;0x 04 |
U4 | bytes | 1 | 高位在前的float值 |
(4)、 constant_long_info:long类型的值
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为5;0x 05 |
U8 | bytes | 1 | 高位在前的long值 |
(5)、 constant_double_info:double的值
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为6;0x 06 |
U8 | bytes | 1 | 高位在前的long值 |
(6)、 constant_class_Info:使用符号引用表示类或者接口。
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为7;0x 07 |
U2 | Name_index | 1 | 包含类或者接口的全限定名的constant_utf8_info的索引 |
(7)、 constant_string_info:文字字符串者java.lang.string的实例
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为8;0x 08 |
U2 | String_index | 1 | 包含文字字符串值的constant_utf8_info的索引 |
(8)、 constant_fieldref_info:指向字段的符号引用;
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为9;0x 09 |
U2 | Class_indx | 1 | 被引用字段的类或者接口constant_utf8_info的索引 |
U2 | Name_and_type_index | 1 | 提供constant_nameandtype_info的索引 |
(9)、 constant_method_info:方法的符号引用
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为10;0x 0A |
U2 | Class_indx | 1 | 被引用字段的类或者接口constant_utf8_info的索引 |
U2 | Name_and_type_index | 1 | 提供constant_nameandtype_info的索引 |
(10)、 constant_interfaceMethodref_info:接口中申明的方法的符号引用
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为11;0x 0B |
U2 | Class_indx | 1 | 被引用字段的类或者接口constant_utf8_info的索引 |
U2 | Name_and_type_index | 1 | 提供constant_nameandtype_info的索引 |
(11)、 constant_nameandtype_info:提供引用字段或者方法的简单名称和描述符的常量池入口
类型 | 名称 | 数量 | 说明 |
U1 | tag | 1 | 标志值为12;0x 0C |
U2 | name_indx | 1 | 被引用字段的类或者接口constant_utf8_info的索引 |
U2 | Descriptor_index | 1 | 被引用字段的类或者接口constant_utf8_info的索引 |
4.2.2、 field_info:定义在类或者接口中声明的每一个字段;具体格式:
类型 | 名称 | 数量 | 说明 |
U2 | Access_flags | 1 | 申明字段的修饰符 |
U2 | name_indx | 1 | 简单名称的constant_utf8_info的索引 |
U2 | descriptor_index | 1 | 字段描述符的constant_utf8_info的索引 |
U2 | Attributes_count |
| Attribute_info的数量 |
Attribute_info | attributes | Attributes_count | Attribute_info的列表 |
4.2.3、 method_info:定义在类或者接口中声明的方法
类型 | 名称 | 数量 | 说明 |
U2 | Access_flags | 1 | 修饰符 |
U2 | name_indx | 1 | 方法简单名称的constant_utf8_info的索引 |
U2 | descriptor_index | 1 | 方法描述符的constant_utf8_info的索引 |
U2 | Attributes_count |
| Attribute_info的数量 |
Attribute_info | attributes | Attributes_count | Attribute_info 的列表 |
4.2.4、 attribute_info:jvm 规范一共定义了9中属性
类型 | 名称 | 数量 | 说明 |
U2 | Attribute_name_index | 1 | 属性名称的constant_utf8_info的索引 |
U4 | Attribute _length | 1 | 属性数据的长度,不包含开始的6个字节 |
U1 | info | 1 | 数据 |
5、特殊字符串:常量池中包含有三种特殊的字符串:全限定名,简单名称和描述符;
所有的符号引用都包括类或者接口的全限定名,字段的符号引用除了全限定名之外,还有简单字段,和字段的描述符;方法的符号引用除了全限定名之外,还有简单方法和描述符;
- 全限定名:常量池入口指向类或者接口的时候,给出类或者接口的全限定名,如:java/lang/object .由/替换
- 简单名称:字段名或者方法名以简单名称出现在常量池,如:java.lang.system的java.io.printstream out 在常量池中为out
- 描述符:字段的描述符给出字段的类型,方法的描述符,给出方面的返回值和方法的参数的数量、类型和顺序
6、class 文件的内容格式: 按照先后顺序依次为下表的结构!
类型 | 名称 | 数量 | 说明 |
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 | Interface的常量索引 |
U2 | Fields_count | 1 | 字段数量 |
Field_info | fields | Fields_count | 字段的信息 |
U2 | Methods_count | 1 | 方法的数量 |
Method_info | methods | Methods_count | 方法的信息 |
U2 | Attributes_count | 1 | 属性的数量 |
Attributes_info | attributes | Attributes_count | 属性的信息 |