jvm虚拟机-1 class文件解析

1.概述

        不论什么Class文件都相对应唯一一个类或接口的定义信息,但不是全部的类或接口都得定义在文件里(它们也能够通过类载入器直接生成)。

Class文件是一组以8位字节为基础单位的二进制流。各个数据项严格按顺序排列。

Class文件格式采用一种类似于C语言结构体的伪结构来存储数据。这样的伪结构仅仅有两种数据类型:无符号数和表。

2. 基本结构

2.1 class文件组成内容

无符号数:是基本数据类型。以u1、u2、u4、u8分别代表1个字节、2个字节、4个字节、8个字节的无符号数,能够用来描写叙述数字、索引引用、数量值或者依照UTF-8编码构成的字符串值。

:由多个无符号数或者其它表作为数据项构成的复合数据类型。全部表都习惯性地以“_info”结尾。

2.2 class文件格式

整个Class文件本质上就是一张表,例如以下所看到的:

类型名称数量描述
u4magic1魔数
u2minor_version1次版本号
u2major_version1主版本号
u2constant_pool_count1常量池计数器
cp_infoconstant_poolconstant_pool_count-1常量池
u2access_flags1访问标志
u2this_class1类索引
u2super_class1父类索引
u2interfaces_count1接口计数器
u2interfacesinterfaces_count接口索引集合
u2fields_count1字段计数器
field_infofieldsfields_count字段表集合
u2methods_count1方法计数器
method_infomethodsmethods_count方法表集合
u2attributes_count1属性计数器
attribute_infoattributesattributes_count属性表集合

2.2.1 类文件解析

    如下Test类:

编译后的class文件如下:

2.2.1.1.魔数

每一个class文件的头4个字节称为魔数,它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件。

非常多文件存储标准中都使用魔数来进行身份识别。譬如图片格式gif、jpeg等。使用魔数而不是拓展名来进行识别主要是基于安全方面的考虑,由于文件拓展格式能够任意修改。

Class文件的魔数为:0xCAFEBABE

2.2.1.2.版本

第五六个字节是次版本(Minor Version)。第7和第8个字节是主版本(Major Version)。

高版本号的JDK能够向下兼容曾经版本号的Class文件,可是无法执行以后版本号的Class文件,即使文件格式并未发生变化,虚拟机也必须拒绝执行超过其版本号号的Class文件。

常量池能够理解为Class文件之中的资源仓库,是Class文件结构中与其它项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之中的一个。同一时候也是在Class文件里第一个出现的表类型数据项目。

2.2.1.3常量池

因为常量池中常量的数目是不固定的,所以在常量池入口须要放置一个2字节长的无符号数constatn_pool_count来代表常量池容量计数值。这个容量计数从1而不是0开始。

constant_pool_count:占2字节。0x0016。转化为十进制为22,即说明常量池中有21个常量(仅仅有常量池的计数是从1开始的,其他集合类型均从0开始),索引值为1~22。第0项常量具有特殊意义。假设某些指向常量池索引值的数据在特定情况下须要表达“不引用不论什么一个常量池项目”的含义,这样的情况能够将索引值置为0来表示

常量池中主要存放两大类常量:字面量和符号引用。字面量如文本字符串、声明为final的常量值等(=号右边数据)。符号引用包含三类常量:类和接口的全限定名、字段的名称和描写叙述符、方法的名称和描写叙述符。

类和接口权限定名:com.shx.Test

字段的名称和描写叙述符、方法的名称和描写叙述符:private、public、protected

常量池结构表:

类型

简单介绍

项目

类型

描写叙述

CONSTANT_Utf8_info

utf-8缩略编码字符串

tag

u1

值为1

length

u2

utf-8缩略编码字符串占用字节数

bytes

u1

长度为lengthutf-8缩略编码字符串

CONSTANT_Integer_info

整形字面量

tag

u1

值为3

bytes

u4

依照高位在前储存的int

CONSTANT_Float_info

浮点型字面量

tag

u1

值为4

bytes

u4

依照高位在前储存的float

CONSTANT_Long_info

长整型字面量

tag

u1

值为5

bytes

u8

依照高位在前储存的long

CONSTANT_Double_info

双精度浮点型字面量

tag

u1

值为6

bytes

u8

依照高位在前储存的double

CONSTANT_Class_info

类或接口的符号引用

tag

u1

值为7

 

index

u2

指向全限定名常量项的索引

CONSTANT_String_info

字符串类型字面量

tag

u1

值为8

index

u2

指向字符串字面量的索引

CONSTANT_Fieldref_info

字段的符号引用

tag

u1

值为9

index

u2

指向声明字段的类或接口描写叙述符CONSTANT_Class_info的索引项

index

u2

指向字段描写叙述符CONSTANT_NameAndType_info的索引项

CONSTANT_Methodref_info

类中方法的符号引用

tag

u1

值为10

index

u2

指向声明方法的类描写叙述符CONSTANT_Class_info的索引项

index

u2

指向名称及类型描写叙述符CONSTANT_NameAndType_info的索引项

CONSTANT_InterfaceMethodref_info

接口中方法的符号引用

tag

u1

值为11

index

u2

指向声明方法的接口描写叙述符CONSTANT_Class_info的索引项

index

u2

指向名称及类型描写叙述符CONSTANT_NameAndType_info的索引项

CONSTANT_NameAndType_info

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

tag

u1

值为12

index

u2

指向该字段或方法名称常量项的索引

index

u2

指向该字段或方法描写叙述符常量项的索引

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值