本书由Java虚拟机技术创建人撰写,全面而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。书中完整地讲述了由JavaSE8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,以及为支持类型注解及方法参数注解而对class文件格式所做的扩展等,还阐明了class文件中各属性的含义及字节码验证的规则。本书基于JavaSE8,是深度了解Java虚拟机和Java语言实现细节的极佳选择。
Java虚拟机技术创建人撰写,全解Java SE 8引入的新特性,深度了解Java虚拟机和Java语言实现细节之可选佳作
前言
本书涵盖了自2011年发布Java SE 7版之后所发生的所有变化。此外,为了与常见的Java虚拟机实现相匹配,本书还添加了大量修订及说明。
本版与前面各版一样,仅仅描述了抽象的Java虚拟机,而在实现具体的Java虚拟机时,本书仅指出了设计规划。Java虚拟机的实现必须体现出本书所列规范,但仅在确有必要时才受限。
对Java SE 8而言,Java编程语言里的一些重要变化在Java虚拟机中都有相应的体现。为了尽量保持二进制兼容性,我们应该直接在Java虚拟机里指定令人满意的默认方法,而不应该依赖于编译器,因为那样做将无法在不同厂商、版本的产品之间移植。此外,那种做法也不可能适用于已有的class文件。在设计JSR 335——Lambda Expressions for the Java Programming Language(《Java编程语言的lambda表达式》)时,Oracle公司的Dan Smith向虚拟机实现者咨询了将默认方法集成到常量池和方法结构、方法与接口方法解析算法,以及字节码指令集中的上佳方式。JSR 335也允许在class文件级别的接口里出现private方法与static方法,而这些方法也同接口方法解析算法紧密地结合起来了。
Java SE 8的特点之一是:Java SE平台的程序库也伴随着Java虚拟机一起进化。有个小例子可以很好地说明这一特点:在运行程序的时候,Java SE 8可以获取方法的参数名,虚拟机会把这些名字存放在class文件结构中,而与此同时,java.lang.reflect.Parameter里也有个标准的API能够查询这些名字。另外,我们也可以通过class文件结构中一项有趣的统计数据来说明这个特点:本规范的第1版中定义了6个属性,其中有3个属性对Java虚拟机至关重要,而Java SE 8版的规范则定义了23个属性,其中只有5个属性对Java虚拟机很重要。换句话说,在新版规范中,属性主要是为了支持程序库而设计的,其次才是为了支持Java虚拟机本身。为了帮助读者理解class文件结构,本规范会更为清晰地描述出每项属性的角色及使用限制。
在Oracle公司的Java Platform团队里,有多位同事都对这份规范提供了很大的支持,他们包括:Mandy Chung、Joe Darcy、Joel Franck、Staffan Friberg、Yuri Gaevsky、Jon Gibbons、Jeannette Hung、Eric McCorkle、Matherey Nunez、Mark Reinhold、John Rose、Georges Saab、Steve Sides、Bernard Traversat、Michel Trudeau和Mikael Vidstedt。特别感谢Dan Heidinga(IBM)、Karen Kinnear、Keith McGuigan及Harold Seigel对常见的Java虚拟机实现中的兼容性及安全性问题做出的贡献。
Alex Buckley
于加利福尼亚州圣克拉拉
2014年3月