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