Java编程的动态性,第1部分: 类和类装入 - 编程入门网
它包括类名和方法名、特征符以及字符串(您可以在十六进制转储右侧的文 本解释中识别它们),还有各种二进制值。
常量池中各项的长度是可变的,每项的第一个字节标识项的类型以及对它解码的方式。这 里我不详细探究所有这些内容的细节,如果感兴趣,有许多可用的的参考资料,从实际的 JVM 规范开始。关键之处在于常量池包含对该类所用的其它类和方法的所有引用,还包含了 该类及其方法的实际定义。常量池往往占到二进制类大小的一半或更多,但平均下来可能要 少一些。 常量池后面还有几项,它们引用了类本身、其超类以及接口的常量池项。这些项后面是有 关字段和方法的信息,它们本身用复杂结构表示。方法的可执行代码以包含在方法定义中的 代码属性的形式出现。用 JVM 的指令形式表示该代码,一般称为 字节码,这是下一节要讨 论的主题之一。 在 Java 类格式中, 属性被用于几个已定义的用途,包括已提到的字节码、字段的常量 值、异常处理以及调试信息。但是属性并非只可能用于这些用途。从一开始,JVM 规范就已 经要求 JVM 忽略未知类型的属性。这一要求所带来的灵活性使得将来可以扩展属性的用法以 满足其它用途,例如提供使用用户类的框架所需的元信息,这种方法在 Java 派生的 C# 语 言中已广泛使用。遗憾的是,对于在用户级利用这一灵活性还没有提供任何挂钩。 Java编程的动态性,第1部分: 类和类装入(2)时间:2011-04-09 IBM Dennis M. Sosnoski字节码和堆栈 构成类文件可执行部分的字节码实际上是针对特定类型的计算机 ― JVM ― 的机器码。 它被称为 虚拟机,因为它被设计成用软件来实现,而不是用硬件来实现。每个用于运行 Java 平台应用程序的 JVM 都是围绕该机器的实现而被构建的。 这个虚拟机实际上相当简单。它使用堆栈体系结构,这意味着在使用指令操作数之前要先 将它们装入内部堆栈。指令集包含所有的常规算术和逻辑运算,以及条件转移和无条件转移 、装入/存储、调用/返回、堆栈操作和几种特殊类型的指令。有些指令包含立即操作数值 ,它们被直接编码到指令中。其它指令直接引用常量池中的值。 尽管虚拟机很简单,但实现却并非如此。早期的(第一代)JVM 基本上是虚拟机字节码的 解释器。这些虚拟机实际上 的确相对简单,但存在严重的性能问题 ― 解释代码的时间总是 会比执行本机代码的时间长。为了减少这些性能问题,第二代 JVM 添加了 即时(just-in- time,JIT)转换。在第一次执行 Java 字节码之前,JIT 技术将它编译成本机代码,从而对 于重复执行提供了更好的性能。当代 JVM 的性能甚至还要好得多,因为使用了适应性技术来 监控程序的执行并有选择地优化频繁使用的代码。 装入类 诸如 C 和 C++ 这些编译成本机代码的语言通常在编译完源代码之后需要链接这个步骤。 这一链接过程将来自独立编译好的各个源文件的代码和共享库代码合并起来,从而形成了一 个可执行程序。Java 语言就不同。使用 Java 语言,由编译器生成的类在被装入到 JVM 之 前通常保持原状。即使从类文件构建 JAR 文件也不会改变这一点 ― JAR 只是类文件的容器 。 链接类不是一个独立步骤,它是在 JVM 将这些类装入到内存时所执行作业的一部分。在 最初装入类时这一步会增加一些开销,但也为 Java 应用程序提供了高度灵活性。例如,在 编写应用程序以使用接口时,可以到运行时才指定其实际实现。这个用于组装应用程序的 后 联编方法广泛用于 Java 平台,servlet 就是一个常见示例。 JVM 规范中详细描述了装入类的规则。其基本原则是只在需要时才装入类(或者至少看上 去是这样装入 ― JVM 在实际装入时有一些灵活性,但必须保持固定的类初始化顺序)。每 个装入的类都可能拥有其它所依赖的类,所以装入过程是递归的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |