类文件结构

类文件结构
1,魔数和Class文件的版本
每个Class文件的头4个字节称为魔数(Magic Number).他的唯一作用是确定这个文件是否为一个能被虚拟机接收的Class文件。
紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Monor Version),第7和第8个字节是主版本号(Major Version)。

2,常量池
紧接着主次版本号之后的是常量池入库,常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一。同时还是Class文件第一个出现的表类型数据项目。
由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constant_pool_count)。与java中语言习惯不同的是,这个容量计数是从1开始而不是0开始。他主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References).字面量接近于java语言层面的常量概念,如文本字符串,声明为final的常量值等。
符合引用包括下面三类常量:
类和接口的全限定名(Fully Qualified Name)
字段的名称和描述符(Descriptor)
方法的名称和描述符

3,访问标志
在常量池结束之后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。access_flags中一共有16个标志位可以使用,当前只定义了其中8个,没有使用到的标志位要求一律为0.

4,类索引、父类索引与接口索引集合
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。由于java语言不支持多重继承,所有父类索引只有一个,除了java.lang.Object之外,所有的java类都有父类,因此除了java.lang.Object外,所有java类的父类索引都不为0.接口索引集合就用来描述这个类实现了哪些接口,这些被实现的接口将按implements语句(如果这个类接口本身是一个接口,则应当是extends语句)后的接口顺序从左到右排列在接口索引集合中。

5,字段集合
字段表(field_info)用于描述接口或者类中声明的变量。字段(field)包括类级变量以及实例级变量,但不包括在方法内部生命的局部变量。


6,方法表集合
方法表的结构如图字段表一样,一次包括了访问标志(access_flags),名称索引(name_index),描述符索引(descriptor_index),属性表集合(attributes)几项。

7,属性表集合
太多不想写了
----------------




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值