java Class类文件的结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前方式侵害成若干个8位字节时行存储。如下所示:

package jvm;
public class BigObject {
	public static void main(String[] args) {
	System.out.println("ssss");
	}
}

在这里插入图片描述

1.魔数与Class文件版本
每个Class文件的头4 个字节为魔数,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。很多文件存储标准中都使用魔数来进行身份识别,譬如图片格式。文件的魔数可以自由的选择,只要这个魔数值还没有被 广泛采用过而且不会引起混淆即可。Class文件 的魔数的获得很有浪漫气息,值为:oxCA FE BA BE(咖啡宝贝)。接下来四个字节代表的是主版本号处次版本好,jdk1.8的值为:ox00 00 00 34,即10进制的52,表示可以被JDK1.8以上版本的虚拟机执行的class文件。
2.常量池
常量池是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是Class文件中第一个出现的表类型数据项目。由于常量池中常量计数值的数量 是不固定 的,所以在常量 池的入口放置一项u2类型的数据,代表常量池计数值(constant_pool_count)。与java中的语言习惯不一样的是,这个容量计从1而不是0开始的。如上图值为:ox001d,即十进制29,这就代表常量池中有28项常量,索引值为1-28。常量池之中主要存放两大类常量:字面量(literal)和符号引用(Symbolic References)。字面量比较接近于java语言层面的常量概念,如文本字符串、被声明为final的常量等。面符号引用则属于编译原理方面的概念,包括三类常量:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。
java代码在进行javac编译的时候,并不像c和c++那样有连接的步骤,面是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Class文件中不会保存各个方法字段的最终内存布局信息,因此这些字段和方法的符号引用不经过转换的话是无法直接被虚拟机使用的,。当虚拟机运行时,需要从常量池得对应符号引用,再在类创建时或运行时解析并翻译到具体的内存地址之中。
3.访问标志
在常量池结束之后,紧接着的2个字节代表访问标志,这个标志用于识别一些类工接口的访问信息,包括:这个Class是类还是接中j否定义为public类型,是否定义为abstract类型,如果是类的话,是否声明为final,等 等。
4.类索引、父索引与接口索引集合
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,Class文件 中由这三项数据来确定这个类的继承关系。
5.字段表集合
字段表用于描述接口或类中声明的变量。字段包括了类级变量或实例级变量,但不包括在方法 内部声明的变量。包括的信息有:字段的作用域(public、private、protected修饰符)、是类级变量还是实例级变量(static修饰符)、可变性(final)、并发可见(volatile修饰符)、可否序列化(transient修饰符)、字段数据类型(基本类型、对象、数组)、字段名称。格式如下:

类型名称 数量
u2access_flags 1
u2name_index 1
u2despcriptor_index 1
u2attributes_count 1
attribute_infoatrributes attributes_count

6.方法表集合
Class文件存储格式对方法的描述与对字段的描述几乎采用了完全一致的方式,方法表的结构和字段表一样。仅访问标识和属性集合的可选项中有所区别。
7.属性表集合
包括code属性,Exceptions属性,LineNumberTable属性,localVariableTable属性,SourceFile属性,constantValue属性,innerClasses属性,Deprecated属性及Synthetic属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值