您的位置:首页 > 其它

jvm——003类文件结构

2018-02-23 16:40 316 查看
    类文件结构这一章内容,稍加生涩,外加对Class文件不了解。故简单罗列。说到这就不得不夸赞下CSDN的近似匹配的功能了,相信在我的博客下方会有一大波关于类文件结构的文章。想来写一篇博客,就收罗了好多博客,岂不快哉。
总结
    每个Class文件都涉及版本号,针对不同的jdk版本,jdk向下兼容。常量池是存放各种各样的字面量和符号引用。Class文件针对类,方法,字段都有相应的一堆符号。这些符号用来标识并且描述类,方法,字段。当描述符不足以描述时,就出现了属性表,属性表是对这三者的一个补充,其中方法的属性表书中讲解稍多。这些描述符大都是执行常量池中的内容的。Java虚拟机采用面向操作数栈的指令架构而不是面向寄存器。

关联Class文件
    Java虚拟机不和包括Java在内的任何语言绑定,只与Class文件这种特定的二进制文件格式所关联,Class文件中包函了Java虚拟机指令集和符号表以及若干其他辅助信息。简而言之,Class文件里的代码是更加贴近JVM虚拟机的。那么Java文件的内容在Class文件里是怎么描述的呢?Java语言中的各种变量,关键字和运算符号的语义最终都是有多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更加强大。
Class文件结构
    Class文件是一组以8位字节为基础单位的二进制流,数据之间无空隙。采用C语言结构体的伪结构存储数据,数据类型只有两种:无符号数和表。其中无符号数用来描述数字,索引引用,数量之或者按照UTF-8编码构成的字符串值。表是由多个无符号数或者其他表作为数据项构成的符合数据类型。
魔数与Class文件的版本 
    每个Class文件的头4个字节称为魔数,它的作用是确定这个文件是否为一个能够虚拟机接受的Class文件。继魔数4个字节的后4个字节,存储Class文件的版本号,JDK的版本支持相应范围的Class版本。jdk向下兼容。
常量池
    常量池是Class文件的资源仓库,是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时也是Class文件中第一个出现的表类型数据项目。常量池主要存放两大类常量:字面量和符号引用。字面量包括文本字符串,声明为final的常量值等。符号引用则包括 类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。
类索引,父索引,接口索引集合
    类索引确定类的全限定名,父类索引确定类的父类的全限定名。接口索引用来描述这个类实现了那些接口。

字段表
    字段表用于描述接口或类中声明的变量,字段包括类级变量以及实例变量。字段可以包含以下信息:字段的修饰符,实例变量还是类变量(是否为static),可见性(final),并发可见性(volatile),可否被序列化(transient),字段数据类型。
方法表
    方法表的结构依次包括访问标志,名称索引,描述符索引,属性表集合几项。方法的定义可以通过访问标志,名称索引,描述符索引表达清楚,其中的方法里的代码都存放在方法属性表集合一个名为code的属性里面。在Java语言里,要重载一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的特诊签名,这个特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合。但是在Class文件格式里,特征签名的范围更大,只要描述符不是完全一致的两个方法也可以共存。这就是为什么,在代码里除了返回值不同外,其余都相同的方法不会发生编译报错的原因。

属性表
    在Class文件,字段表,方法表都可以携带自己的属性表集合。用于描述某些场景专有的信息。简单列出自己熟悉的属性Code属性,SourceFile属性,ConstantValue属性。
字节码指令
    Java虚拟机采用面向操作数栈而不是寄存器的架构,估摸着寄存器架构就是之前学到过的汇编。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: