Java虚拟机的Class文件结构详解.doc

Java虚拟机的Class文件结构详解.doc

ID:62033662

大小:630.50 KB

页数:7页

时间:2021-04-15

Java虚拟机的Class文件结构详解.doc_第1页
Java虚拟机的Class文件结构详解.doc_第2页
Java虚拟机的Class文件结构详解.doc_第3页
Java虚拟机的Class文件结构详解.doc_第4页
Java虚拟机的Class文件结构详解.doc_第5页
资源描述:

《Java虚拟机的Class文件结构详解.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、深入JVM的Class文件结构Class文件由顺序的8位字节为基础单位构成的二进制流。各个项目严格按照顺序紧凑排列,无分隔符。需要用8位字节以上空间数据项时按照高位在前分割成若干个8位字节存储。只包含2种数据类型:·无符号数·表无符号数是class文件基本数据类型,以u1,u2,u4,u8分别代表1个字节,2个,4个,8个字节的无符号数。可以用来描述数字、索引引用、数量值、以UTF—8编码构成的字符串.表由多个无符号数或其他表作为数据项构成的复合数据类型。所有表以“_info”结尾。用来描述具有层

2、次关系的复合结构数据。其实class文件本质上就是一张表。Class文件结构包含magic魔数,文件版本,常量池,访问标识,类索引、父类索引与接口索引集合,字段表集合,方法表集合,属性表集合等构成魔数在class文件头4个字节,magicnumber.作用:确定该文件是否是虚拟机可接受的class文件.java的魔数统一为0xCAFEBABE(来源于一款咖啡).版本号由minorversion和majorversion组成,占用文件中第5到8字节.如CAFE BABE00000032表示此版本号为

3、50.0,十进制表示一般格式为major.minorﻫ需要注意的是java版本号是从45开始的,大版本发布,主版本号+1。高版本的jdk能向下兼容以前版本的class文件,但不兼容以后版本的class文件。各jdk编译后的class文件版本号如下:常量池紧接着版本号后就是常量池入口。是第一个出现的表类型的数据项目。ﻫ由常量池容量计数值constant_pool_count及常量池constant_pool组成。ﻫconstant_pool_count占2个字节。如0×0016即十进制的22,表示有

4、21项常量,从1开始到21。0有特殊含义,表示指向常量池的索引值数据不引用任何一个常量池项目。常量池主要存放字面量Literal和符号引用Symbolic References.字面量可能是文本字符串,或final的常量值.符号引用包括以下:·类或接口全限定名FullQualifiedName·字段名称和描述符Descriptor·方法名称和描述符常量池共有11种表结构数据.每个表均开始的第一位是u1类型的标志位,表示哪种常量类型。但每个表的结构都不相同。ﻫ如类或接口的符号引用为CONSTANTC

5、lassinfo。所有的常量池结构严格以标志位,表结构其他数据类型 顺序排列.各类型常量池表结构如下表所示:实际中可以使用javap—verboseXXX.class输出字节码内容。访问标志access_flagsu2类型,识别类或接口层次的访问信息,如class是接口或类,是否public,是否abstract,是否final等。类索引、父类索引与接口索引集合类索引this_class及父类索引super_class均是u2类型,接口索引集合interfaces是一组u2类型的集合。确定类的继承

6、关系.按照顺序排列在访问标志之后。this_class,super_class指向CONSTANT_CLASS_info常量。通过该常量可以找到定义在CONSTANT_Utf8_info的全限定名字符串。字段表集合field_info紧接在interface后面的是fieldscount的计数,它是类变量和实例变量的字段的数量总和。在这个计数后面的是不同长度的fieldinfo表的序列(fieldscount指出了序列中有多少个fieldinfo表)。描述接口或类中声明的变量,包含类级变量或实例级

7、变量,不包含方法变量。信息包含:字段作用域、字段类型(类变量还是实例变量static)、可变性(final)、并发可见性(volatile)、可否序列化(transient)、字段数据类型、名称等。ﻫ结构如下表:字段修饰符放在accessflags项目中,它与类中的accessflags项目是非常相似的,都是一个u2的数据类型,其中可以设置的标志位和含义如下表所示nameindex和descriptorindex都是对常量池的引用,分别代表着字段的简单名称及字段和方法的描述符.其中描述符的作用是用

8、来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值.根据描述符规则,基本数据类型(byte、char、double、float、int、long、short、boolean)及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符L加对象的全限定名来表示.对于数组类型,每一个维度将使用一个前置的”["字符来描述,如一个定义的”java。lang.String[][]“类型的二维数组,将被记录为:”[[Ljava/lang/String;”,一个整型

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。