Java Class文件结构

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

属性的信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值