初识Java虚拟机(5)类文件结构

    各种不同平台的Java虚拟机和所有平台都同意使用字节码(Bytecode)作为程序储存格式,它是构成平台无关性的基石,符合Java刚刚诞生之时提出的“一次编写,到处运行”(Write Once,Run Anywhere)。Java虚拟机的语言无关性的基础仍然是虚拟机和字节码的储存格式。Java虚拟机不与任何语言绑定,它只与“Class文件”这种特定的二进制文件格式相关联,虚拟机并不关心Class文件的来源是何种语言。
    Java语言中各种变量、关键字和运算符号的语义最终都是由多条字节码命令组合而成,因此字节码命令所能提供的语义描述能力肯定比Java语言本身更加强大。因此,有一些Java语言本身无法有效支持的语言特性不代表字节码本身无法有效支持,这也为其他语言实现一些有别于Java的语言特性提供了基础。
    Class文件的结构
    Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中,没有任何分隔符。当遇到需要占用8位字节以上空间的数据项时,会按照大端模式(Big-Endian:高位字节在地址最低位,最低字节在地址最高位 和纸面同序)进行储存。
    根据Java虚拟机的规定,Class文件格式采用类似于C语言结构体的伪结构来储存数据,它只有两种数据类型:无符号数和表。以下按顺序介绍Class文件格式,用u1、u2代表1字节、2字节的无符号数,用“_info”结尾的代表表。
    1、u4,magic:每个Class文件头四个字节成为魔数,唯一作用是确定这个文件是否为一个能被虚拟机接收的Class文件。
    2、u2,minor_version:次版本号。
    3、u2,major_version:主版本号,虚拟机只能运行不高于其版本号的Class文件。
    4、cp_info,常量池:常量池可以理解为Class文件的资源仓库,常量池的头两个字节代表常量值容量计数值,从1开始(代表有0项常量)。常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic Reference)。字面量比较接近于Java语言层面的常量概念,如文本字符串,声明为final的常量值等。而符号引用包含以下三类常量:(1)类和接口的全限定名(2)字段的名称和描述(3)方法的名称和描述。常量池中每一个常量都是一个表,JDK1.7中一共有14种类型(如字符串、整形、方法、接口等),他们之间以开头的u1作为标志位进行区分。每个类型的表都有确定的结构大小。
    5、u2,access_flag:访问标志,用于识别一些类或者接口层次的信息,包括:这个Class是类还是接口;是否定义为public;是否定义为abstract;如果是类,是否为final等。
    6、u2,u2,this_class,super_class:this_class(类索引)用于确定这个类的全限定名,super_class(父索引)用于确定这个类的父类全限定名。
    7、u2,u2s,interfaces_count,interfaces:u2代表接口数量n,下面接着n个u2的接口索引。
    8、u2,fields_count:字段表的数量。
    9、field_info,字段表:用于描述接口或者类中声明的变量。可以包含的信息有:字段作用域(public、private···)、是实例变量还是类变量(static)、可变性(final)、并发可见性(volatile)、可否序列化(transient)、字段数据类型(基本类型、对象、数组)、字段名称。
    10、u2,methods_count:方法数。
    11、method_info:方法表,类似于字段表。
    12、u2,attributes_count:属性数。
    13、attribute_info:属性表,用以描述某些场景专有的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值