笔记-Java基础之Class类文件的结构

无关性

Java刚刚诞生之初的宣传口号:“一次编写,到处运行(write once,run anywhere)”。

平台无关性-支撑这句话的关键在于:运行在不同平台之上的各种各样的虚拟机。各种不同平台的虚拟机和平台都统一使用的程序存储格式-字节码(ByteCode)是构成平台无关性的基石。

语言无关性-虚拟机还有另外一种无关性,在Java发展之初,设计者就曾经考虑过并实现了让其他语言运行在Java虚拟机之上的可能性。因此,Java的规范文档被拆分成了Java语言规范以及Java虚拟机规范。而实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联。也就是说只要你能将本语言编译为存储字节码的Class文件,那么虚拟机就可以运行它,虚拟机是不会关心CLass的来源是何种语言的。

Class类文件的结构

Class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件之中,中间没有添加任何分隔符。

Class文件采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:

无符号数:无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节、8个字节。无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8构成字符串值。

表:表是由多个无符号数或者其他表作为数据项构成的符合数据类型,所有表习惯性的以“_info”结尾。表用于描述有层次关系的复合结构的数据,整个Class文件本质上就是一张表。

无论是无符号数还是表,当同一类型但数量不定时,经常会使用一个前置的容量计数器加若干个连续的数据项的形式,这时称这一系列连续的某一类型的数据为某一类型的集合。

Class文件不像XML等描述语言,由于它没有任何分隔符号,所以在上表中的数据项,无论是顺序还是数量,甚至数据存储的字节序这样的细节,都是被严格限定的。哪个字节代表什么含义,长度是多少,先后向顺序,都不允许改变。

使用十六进制编辑器WinHex打开一个被编译后的.class文件就是如下所示:

猜你喜欢

转载自blog.csdn.net/helianus/article/details/89311934