类文件结构
类文件结构目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、概述
由于最近十年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,把我们编写的程序编译成二进制本地机器码(Native Code) 已不再是唯一的选择, 越来越多的程序语言选择了与操作系统和机器指令集无关的、 平台中立的格式作为程序编译后的存储格式。
二、无关性基石
java在诞生时就提出过一个著名的口号“一次编写,到处运行(Write Once,Run Anywhere)”,可见当时的软件开发人员堆冲破平台的界限是有多么渴求。各种系统。操作平台定然会并存发展下去,那么最终只有实现在操作系统以上的应用层。oracle以及其他虚拟及发行商发布过许多运行在各种硬件平台的java虚拟机,这些虚拟机都可以载入并执行同一种与操作平台无关的字节码文件。从而实现了“一次编写,到处运行”。
实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不与包括Java语言在内的任何程序语言绑定, 它只与“Class文件”这种特定的二进制文件格式所关联, Class文件中包含了Java虚拟机指令集、 符号表以及若干其他辅助信息。 基于安全方面的考虑,《Java虚拟机规范》 中要求在Class文件须应用许多强制性的语法和结构化约束, 但图灵完备的字节码格式, 保证了任意一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件。 作为一个通用的、与机器无关的执行平台, 任何其他语言的实现者都可以将Java虚拟机作为他们语言的运行基础,以Class文件作为他们产品的交付媒介。 例如, 使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的编译器一样可以把它们的源程序代码编译成Class文件。虚拟机丝毫不关心Class的来源是什么语言,它与程序语言之间的关系如图6-1所示
Java语言中的各种语法、 关键字、 常量变量和运算符号的语义最终都会由多条字节码指令组合来
表达, 这决定了字节码指令所能提供的语言描述能力必须比Java语言本身更加强大才行。 因此, 有一
些Java语言本身无法有效支持的语言特性并不代表在字节码中也无法有效表达出来, 这为其他程序语
言实现一些有别于Java的语言特性提供了发挥空间。
三、Class类文件的结构
任何一个Class文件都对应着唯一的一个类或接口的定义信息[1], 但是反过来说, 类或接口并不一定都得定义在文件里(譬如类或接口也可以动态生成, 直接送入类加载器中) 。本章中,只是通俗地将任意一个有效的类或接口所应当满足的格式称为“Class文件格式”, 实际上它完全不需要以磁盘文件的形式存在。
Class文件是一组以8个字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑地排列在文件之中, 中间没有添加任何分隔符, 这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据, 没有空隙存在。 当遇到需要占用8个字节以上空间的数据项时, 则会按照高位在前[2]的方式分割成若干个8个字节进行存储。
根据《Java虚拟机规范》 的规定, Class文件格式采用一种类似于C语言结构体的伪结构来存储数据, 这种伪结构中只有两种数据类型: “无符号数”和“表”。 后面的解析都要以这两种数据类型为基础, 所以这里笔者必须先解释清楚这两个概念。
·无符号数属于基本的数据类型, 以u1、 u2、 u4、 u8来分别代表1个字节、 2个字节、 4个字节和8个字节的无符号数, 无符号数可以用来描述数字、 索引引用、 数量值或者按照UTF-8编码构成字符串值。
·表是由多个无符号数或者其他表作为数据项构成的复合数据类型, 为了便于区分, 所有表的命名
都习惯性地以“_info”结尾。 表用于描述有层次关系的复合结构的数据, 整个Class文件本质上也可以视
作是一张表, 这张表由表6-1所示的数据项按严格顺序排列构成。
无论是无符号数还是表, 当需要描述同一类型但数量不定的多个数据时, 经常会使用一个前置的容量计数器加若干个连续的数据项的形式, 这时候称这一系列连续的某一类型的数据为某一类型的“集合”。
需要再强调一次, Class的结构不像XML等描述语言, 由于它没有任何分隔符号, 所以在表6-1中的数