共计 1296 个字符,预计需要花费 4 分钟才能阅读完成。
class 文件的由来
Java 类文件是蕴含可在 Java 虚拟机 (JVM) 上执行的 Java 字节码的文件(具备.class 文件扩展名)。Java 类文件通常由 Java 编译器依据蕴含 Java 类的 Java 编程语言源文件(.java 文件)生成(或者,其余 JVM 语言也可用于创立类文件)。如果一个源文件有多个类,则每个类都被编译成一个独自的类文件。
JVM 可用于许多平台,在一个平台上编译的类文件将在另一个平台的 JVM 上执行。这使得 Java 应用程序与平台无关。
class 文件的组成
Java 类文件构造有 10 个根本局部
- 魔数:0XCAFEBABE
- Minor Version AND Major Version:类文件的主要版本和次要版本
- constant_pool: 常量池,类的常量池
- access_flags: 拜访标记,类是否是抽象类、动态类等
- this_class:以后类的名称
- super_class:超类的名称
- interfaces:类中的任何接口
- fields:类中的任何字段
- methods:类中的任何办法
- attributes:类中的任何属性(例如源文件的名称等)
魔数
类文件是由 4 字节的十六进制标识的,在 class 文件中为:CAFE BABE。
这个标识的由来是 James Gosing 在谈到帕洛阿尔托的一家餐厅时解释了这个神奇数字的历史:
“ 咱们过来常去一个叫圣米迦勒巷的中央吃午饭。依据当地传说,在光明的过来,Grateful Dead(1964 年组建的一只美国乐队)在他们成名之前已经在那里上演。这是一个十分时尚的中央,相对是一个 Grateful Dead Kinda Place,Jerry(乐队的主唱)死后,他们甚至建了一个佛教格调的小神社,咱们以前去那里的时候,咱们称这个中央为 Cafe Dead。沿线的某个中央留神到这是一个 HEX 数字。我正在从新批改一些文件格式代码,须要一些神奇的数字:一个用于长久对象文件,一个用于类。我应用 CAFEDEAD 作为对象文件格式,并在 grepping 对于适宜“CAFE”(这仿佛是一个很好的主题)之后的 4 个字符的十六进制单词,我偶尔发现了 BABE 并决定应用它。在那个时候,除了历史的垃圾桶之外,它仿佛并没有什么特地的重要或注定要去任何中央。所以 CAFEBABE 成为类文件格式,而 CAFEDEAD 成为长久对象格局。然而长久对象工具隐没了,随之而来的是 CAFEDEAD 的应用——它最终被 RMI 取代。”
总体布局
因为类文件蕴含可变大小的我的项目并且不蕴含嵌入式文件偏移量, 所以它通常是按程序解析的,从第一个字节到最初。在最低级别,文件格式依据一些根本数据类型进行形容:
- U1: 一个无符号的 8 位整数
- U2: 无符号 16 位整数,大端字节程序
- u4: 一个无符号的 32 位整数,大端字节程序
- table: 某种类型的可变长度我的项目的数组。表中的项目数由后面的计数编号标识(计数为 u2),但表的字节大小只能通过查看其每个我的项目来确定。而后依据上下文将其中一些根本类型从新解释为更高级别的值(例如字符串或浮点数)。没有强制执行字对齐,因而从未应用过填充字节。类文件的整体布局如下表所示。
待更新。。。
扩大常识
Grateful Dead