Java类文件的基本结构.docx

Java类文件的基本结构.docx

ID:62484321

大小:9.59 KB

页数:5页

时间:2021-05-09

Java类文件的基本结构.docx_第1页
Java类文件的基本结构.docx_第2页
Java类文件的基本结构.docx_第3页
Java类文件的基本结构.docx_第4页
Java类文件的基本结构.docx_第5页
资源描述:

《Java类文件的基本结构.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Java类文件的基本结构Java类文件(.class文件)是一个为已编译Java程序仔细定义的格式。Java源代码被编译成能够被任何JVM加载和执行的类文件。在被JVM加载之前,类文件可能是由网络传输而来。类文件是独立于底层平台的,所以适用于更多的地方。它们由简洁的JVM字节码组成,这样就能轻装上阵。类文件常常被压缩,以极快的速度通过网络,到达世界各地的JVM。类文件里有什么?Java类文件包含JVM需要知道的关于一个Java类或接口的一切。按照它们的出现次序,主要的部分有:魔法数(magic),版本号(version),常量池(constantpo

2、ol),访问标示符区(accessflags),当前类区(thisclass),超类区(superclass),父接口区(interfaces),字段区(fields),方法列表区(methods),属性区(attributes)。保存在类文件中的信息经常在长度上有变化,所以信息的实际长度在被加载之前不能被预测。例如,在方法区里的方法数目,类与类之间是不相同的,这取决于源代码中定义的方法个数。类文件中,这些信息的实际大小或长度,被安排在信息内容之前。这样,当类文件被JVM加载时,可变信息的长度首先被读取。一旦JVM知道信息的大小,它就能正确的读取实际

3、的信息内容。类文件中,不同的相邻信息之间通常没有空白或填充字符;一切都以字节(byte)边界对齐。这使得类文件很小,适合网络传输。为了让JVM在加载类文件时,知道需要什么信息以及从哪里可以取得所需信息,类文件的各个组成部分的次序是严格定义的。例如,每个JVM都知道类文件的前8个字节由魔法数和版本号组成,常量池从第9个字节开始,访问标示符区紧跟在常量池后面。但是,因为常量池的长度是可变的,在读取完常量池之前,JVM是不知道访问标示符区具体从什么地方开始。一旦读取完常量池,JVM就知道接下来的2个字节就是访问标示符区。魔法数(Magic)和版本号(Ver

4、sion)每个类文件的开始4个字节都是0xCAFEBABE。这个神奇的数字让Java类文件更容易识别,因为类文件以外的文件几乎不可能也以这四个相同的字节开头。之所以称之为魔法数,是因为它可以被文件格式设计者们从帽子里拉出来(??)。对它仅有的要求是,不能被现实已有的文件格式占用。根据最初Java团队主要成员之一的PatrickNaughton所说,远在“Java”被当作ava语言的名称之前,这个神奇的数字就已经被选好了。我们当时在寻找一个有趣,独特并且很容易记住的数字。OxCAFEBABE作为漂亮的Peet'sCoffee的咖啡师的代称,能预示未来J

5、ava语言的名字,这完全是一个巧合。类文件接下来的4个字节包含了大版本号(majorversion)和小版本号(minorversion)。这些数字标识了特定类文件使用的类文件格式,让JVM可以验证类文件是否可以被载入。每个JVM都有一个它能载入的最大版本号,拒绝加载大于最大版本号的类文件。常量池(ConstantPool)类文件在常量池中保存与类或接口关联的常量。常量池中能看到的部分常量是字符串字面值(literalstrings),final变量的值(finalvariablevalues),类名,接口名,变量名和变量类型,方法名和方法签名(me

6、thodnamesandsignatures)。方法签名由方法返回值类型(returntype)和一组参数类型(argumenttypes)组成。常量池被组织成一个元素长度可变的数组。每个常量占据数组中的一个元素。在整个类文件中,常量通过指示它们在数组中位置的整型索引来引用。第一个常量的索引值是1,第二个是2,以此类推。常量池数组的元素个数写在常量池的前面,所以在加载类文件时,JVM知道它需要加载多少常量。常量池中每个元素以指明自己类型的单字节标签(tag)开始。一旦JVM看到这个标签,就能知道接下来会遇到什么类型的常量。例如,如果看到一个表示字符串

7、的标签,JVM会认为接下来2个字节就是字符串的长度,然后就是“长度”个字节组成的字符串。在本文剩下的部分,我有时会用constant_pool[n]表示常量池数组的第n个元素。从常量池组织的像个数组来说,这是有道理的;但是请记住,这些元素具有不同的大小和类型,并且第一个元素的索引是1。访问标识符区(AccessFlags)常量池之后的2个字节就是访问标示符,它表明该文件定义的是类还是接口;该类或接口是公开的(public)还是抽象的(abstract);如果是类,该类是不是final的。当前类区(Thisclass)接下来2个字节是当前类区,它只是一

8、个常量池数组的索引。被当前类引用的常量constant_pool[this_class],包含两部分:单字节

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

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

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