Java虚拟机-class文件

1.class文件概述

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目按照顺序紧凑的摆列在Class文件之中,中间没有添加任何分隔符,整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在当遇到8位字节以上的空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。Class文件中有两类数据类型,分别是无符号数和表,具体包括:魔数,Class文件版本,常量池,访问标志,类索引,父类索引,接口索引集合,字段表集合,方法表集合,属性表集合。

2.class文件格式

类型名称数量 
u4magic1
u2minor_version1
u2major_version1
u2constant_pool_count1
cp_infoconstant_poolconstant_pool_count - 1
u2access_flags1
u2this_class1
u2super_class1
u2interface_count1
u2interfacesinterface_count
u2fields_count1
field_infofieldsfields_count
u2methods_count1
method_infomethodsmethods_count
u2attributes_count1
attribute_infoattributesattributes_count

3.魔数

字节码的前四个字节标识文件的类型,用于在执行Class文件时校验文件是否为class文件,.class的文件魔数为CAFEBABE。

4.Class文件版本

魔数后4个字节表示的是Class文件的版本,后面两位表示主版本号,前面3个字节为次版本号。对应关系如下表:

JDK1.852
JDK1.751
JDK1.650
JDK1.549
JDK1.448
JDK1.347
JDK1.246
JDK1.145

5.常量池

版本号后2个字节为常量池的长度。之后为常量池。

 cp_info format 
typedescriptorremark
u1tag 
u1info[] 
 CONSTANT_Methodref_info
用于记录方法信息(包括类中定义的方法以及代码中使用到的方法)
 
typedescriptorremark
u1tagCONSTANT_Methodref(10)
u2class_indexconstant_pool中的索引,CONSTANT_Class_info类型。记录定义该方法的类。
u2name_and_type_indexconstant_pool中的索引,CONSTANT_NameAndType_info类型。指定类中纯方法名(name)和方法描述符(descriptor)
 CONSTANT_fieldref_info 
typedescriptorremark
u1tag 
u2index 
u2index 
 CONSTANT_Class_info
用于记录类或接口名
 
typedescriptorremark
u1tagCONSTANT_ClassI(7)
u2name_indexconstant_pool中的索引,CONSTANT_utf8_info类型。表式类或接口名。
 CONSTANT_Utf8_info 
typedescriptorremark
u1tag 
u2length 
u1bytes 

各常量池和index对应关系如下表:

CONSTANT_Utf8_info1
CONSTANT_Integer_info3
CONSTANT_Float_info4
CONSTANT_Long_info5
CONSTANT_Double_info6
CONSTANT_Class_info7
CONSTANT_String_info8
CONSTANT_Fieldref_info9
CONSTANT_Methodref_info10
CONSTATN_Interfacemethodref11
CONSTANT_NameAndType_info12
CONSTATN_MethodHandle_info15
CONSTANT_MethodType_info16
CONSTANT_Dynamic_info18

6.访问标志符

java字节码用两个字节来表示访问标志。

Flag NameValueRemarks
ACC_PUBLIC0x0001public
ACC_FINAL0x0010final
ACC_SUPER0x0020用于兼容早期编译器,新编译器都没有设置该标记,以在使用invokespecial指令时对子类方法做特定处理。
ACC_INTERFACE0x0200接口,同时需要设置:ACC_ABSTRACT。不可同时设置ACC_FINAL、ACC_SUPER、ACC_ENUM。
ACC_ABSTRACT0x0400抽象类,无法实例化。不可与ACC_FINAL同时设置。
ACC_SYNTHETIC0x1000synthetic,由编译器产生,不存在于源代码中。
ACC_ANNOTATION0x2000注解类型,需同时设置:ACC_INTERFACE、ACC_ABSTRACT。
ACC_ENUM0x4000枚举类型
7.类索引

this_class:类索引,super_class:父类索引,interface_count:类实现的接口数量,interfaces:类实现的接口索引。

8.字段表集合

字段表用于描述接口或者类中声明的变量。


一个类中字段的作用域,静态或者非静态,可变形,并发可见性,是否可以序列化都由一个2个字节的access_flags标识,数据类型由descriptor_index标识,字段名称由name_index标识,其他属性由attribute_count和attribute_info标识。

8.方法表集合

方法表集合用来描述类或接口中定义的方法。

Method_info {
acccess_flags u2      --访问标志
name_index u2         --方法名索引
description_index u2 --方法描述索引
attributes_count u2  --属性表长度
attribute_info u2      --属性表信息

}

9.属性表集合

属性表集合用来补充表述字段表和方法表中的信息。

attribute_info {
attribute_name_index u2 --属性名索引
attribute_length u4         --属性长度
info u1                          --属性信息
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值