读书笔记:java的class文件格式分析(一)

    阅读Java Virtual Machine Specification中的第四章,理解Java的class文件格式。

class文件由8位的字节流组成。

The ClassFile Structure

ClassFile{

u4 magic;

u2 minor_version;

u2 major_version;

u2 constant_pool_count;

cp_info constant_pool[constant_pool_count-1];

u2 access_flags;

u2 this_class;

u2 interfaces_count;

u2 interfaces[interfaces_count];

u2 fields_count;

field_info fields[fields_count];

u2 methods_count;

method_info methods[methods_count];

u2 attributes_count;

attribute_info attributes[attrributes_count];

}

说明:u2表示无符号2字节量,u4表示无符号4字节量。

各字段的说明:

magic

一般二进制文件中都有magic number这一项,这个数说明该文件是一个class文件,它的值是0xcAFEBABE。

minor_version,major_version

class文件的版本号。

constant_pool_count

常量池表中项目数加1得到。从后面的cp_info constant_pool[constant_pool_count-1];也容易理解这个值的意思。

cp_info constant_pool[]

存储该class文件中使用到的常量信息。

access_flag

说明该class文件的访问权限和相关属性,通过位掩码来设定。

Flag Name解释
ACC_PUBLIC0x0001public
ACC_FINAL0x0010final
ACC_SUPER0x0020跟调用invokespecial指令时的处理有关
ACC_INTERFACE0x0200这是个接口
ACC_ABSTRACT0x0400abastract
ACC_SYNTHETIC0x1000没有在源代码中出现,该类是编译器生成的
ACC_ANNOTATION0x2000注解类型
ACC_ENUM0x4000枚举类型

这些属性都很容易理解,比如我们定义一个类public final Test{},则Test.class的access_flag中,ACC_PUBLIC和ACC_FINAL是置位的,而ACC_INTERFACE一项肯定是0。很多类似的组合规则倒是容易自己总结出来,比如如果ACC_INTERFACE置位了,那肯定ACC_ABSTRACT也是置位的,因为接口肯定是抽象的;等等,诸如此类。

画一个具体的位示意图表示:

image

this_class

一个下标,指向常量池表中代表当前类的Constant_Class_info。

super_class

为0,或者为一个下标,指向常量池中代表其父类的Constant_Class_info。如果这个值为0,那么当前类肯定是Object类。如果当前类是一个接口,该下标指向的是Object类的描述信息。

interface_count

该类实现的接口数,或者该接口实现的超接口数。

interfaces[]

具体的接口信息,每一项都是常量池表中的一个下标,指向表示接口的Constant_Class_info。

后面几个依次是字段(field),方法(methods)和属性的描述,不再赘述,

下面具体的分析一个class文件。源文件很简单:

public class Test{
public static void main(String[] args){
System.out.println("Hello World!");
}
}

编译,得到Test.class文件,使用WinHex打开。

image

前4个字节是magic部分,内容为0xCAFEBABE;随后的4个字节是class文件的版本号,这里主版本号是0x0032,也就是50,这是使用jdk1.6编译出的class文件。再后面的2个字节是常量池表的大小信息,0x001D,也就是29,说明常量池表中一共有28项。为了方便观察,可以使用javap -verbose Test得到的结果和当前的二进制文件进行对比。

入门到此,以后继续。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值