码迷,mamicode.com
首页 > 其他好文 > 详细

Class文件结构

时间:2019-01-16 20:34:56      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:添加   版本号   vol   nbsp   一个   标识   实例   ble   数字   

JVM所能识别的文件是Class文件,又叫字节码文件。

 

Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流,在Class文件中只有两种数据类型:无符号数和表。

无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

表是由多个无符号数或者其他表作为数据项构成的符合数据类型,习惯的以“_info”结尾。整个Class文件本质上就是一张表。

1.魔数(Magic Number):前四个字节,确定这个文件是否为一个能被虚拟机接受的Class文件。

2.版本号:第五和第六个字节是次版本号(Minor Version),第七第八个字节是主版本号(Major Version)。

3.常量池入口:两个字节

4.常量池:Class文件的资源仓库,他是Class文件结构中国与其他项目关联最多的数据类型。

主要存放两大类常量:字面量和符号引用。

字面量:文本字符串、生命为final的常量值等。

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

5.访问标志:两个字节,用来识别一些类或者接口的访问信息。

6.类索引:两个字节,确定这个类的全限定名。

7.父类索引:两个字节,确定父类的全限定名。

8.接口索引集合,一组两个字节数据的集合,描述这个类实现了那些接口。

9.字段表:用于描述接口或者类中声明的变量。字段包括类变量和实例变量,不包括局部变量。

10方法表:用来描述这个类的方法。

11属性表:Class文件、字段表、方法表都可以携带自己的属性表,用于描述某些场景专有的信息。

 

常量池

常量池中每个常量都是一个表,1.7之前有11中结构不同的表结构数据,1.7之后有添加了3种。

十四种表结构为:

CONSTANT_Utf-8_info UTF-8编码的字符串、

CONSTANT_Integer_info整形字面量、

CONSTANT_Float_info浮点型字面量、

CONSTANT_Long_info长整型字面量、

CONSTANT_Double_info双精度浮点型字面量、

CONSTANT_Class_info类或接口的符号引用、

CONSTANT_String_info字符串类型字面量、

CONSTANT_Fielderf_info字段的符号引用、

CONSTANT_Methodref_info类中方法的符号引用、

CONSTANT_InterfaceMethodref_info接口中方法的符号引用、

CONSTANT_NameAndType_info字段或方法的部分符号引用、

CONSTANT_MethodHandle_info表示方法句柄、

CONSTANT_MethodType_info标识方法类型、

CONSTANT_InvokeDynamic_info表示一个动态方法调用点。

 

类或者接口的访问标志

ACC_PUBLIC 是否为public类型

ACC_FINAL 是否被声明为final,只有类可设置

ACC_INTERFSCE 标识这是一个接口

ACC_ABSTRACT 是否为abstract类型

ACC_SYNTHETIC 标识这个类并非由用户代码产生的

ACC_ANNOTATION 标识这是一个注解

ACC_ENUM 标识这是一个枚举

 

字段表结构

1.access_flags 字段访问标志

字段访问标志有:

ACC_PUBLIC 字段是否public

ACC_PRIVATE 字段是否为private

ACC_PROTECTED 字段是否为protected

ACC_STATIC 字段是否为static

ACC_FINAL 字段是否为fianl

ACC_VOLATILE 字段是否为volatile

ACC_TRANSIENT 字段是否为transient

ACC_SYNTHETIC 字段是否有编译期自动产生

ACC_ENUM 字段是否enum

2.name_index 字段的简单名称

3.name_index 字段和方法的描述符

4.attributes_count

5.attributes 属性表

方法表结构和字段表结构一样

 

Class文件结构

标签:添加   版本号   vol   nbsp   一个   标识   实例   ble   数字   

原文地址:https://www.cnblogs.com/xiaosuye/p/10279100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!