框架所需的元信息,这种方法在 Java
派生的 C# 语言中已广泛使用。遗憾的
是,对于在用户级利用这一灵活性还没有提供任何挂钩。
字节码和堆栈
构成类文件可执行部分的字节码实际上是针对特定类型的计算机 ― JVM ―
的机器码。它被称为 虚拟机,因为它被设计成用软件来实现,而不是用硬件来
实现。每个用于运行 Java
平台应用程序的 JVM 都是围绕该机器的实现而被构
建的。
这个虚拟机实际上相当简单。它使用堆栈体系结构,这意味着在使用指令操作
数之前要先将它们装入内部堆栈。指令集包含所有的常规算术和逻辑运算,以
及条件转移和无条件转移、装入/存储、调用/返回、堆栈操作和几种特殊类型
的指令。有些指令包含立即操作数值,它们被直接编码到指令中。其它指令直
接引用常量池中的值。
尽管虚拟机很简单,但实现却并非如此。早期的(第一代)JVM 基本上是虚拟
机字节码的解释器。这些虚拟机实际上 的确相对简单,但存在严重的性能问题
― 解释代码的时间总是会比执行本机代码的时间长。为了减少这些性能问题,
第二代 JVM
添加了 即时(just-in-time,JIT
)转换。在第一次执行 Java 字节
码之前,JIT 技术将它编译成本机代码,从而对于重复执行提供了更好的性能。
当代 JVM 的性能甚至还要好得多,因为使用了适应性技术来监控程序的执行
并有选择地优化频繁使用的代码。
装入类
诸如 C
和 C++ 这些编译成本机代码的语言通常在编译完源代码之后需要链
接这个步骤。这一链接过程将来自独立编译好的各个源文件的代码和共享库代
码合并起来,从而形成了一个可执行程序。Java
语言就不同。使用 Java 语言,
由编译器生成的类在被装入到 JVM
之前通常保持原状。即使从类文件构建 JAR
文件也不会改变这一点 ― JAR 只是类文件的容器。
链接类不是一个独立步骤,它是在 JVM 将这些类装入到内存时所执行作业的
一部分。在最初装入类时这一步会增加一些开销,但也为 Java 应用程序提供
了高度灵活性。例如,在编写应用程序以使用接口时,可以到运行时才指定其
实际实现。这个用于组装应用程序的 后联编
方法广泛用于 Java 平台,servlet
就是一个常见示例。