Java 编程的动态性

http://www.ibm.com/developerworks/cn/java/j-dyn0429/   
   这一有关 Java 编程动态方面的新的系列文章研究了执行 Java 应用程序时幕后所发生的事情。企业 Java专家 Dennis Sosnoski 提供了 Java 二进制类格式以及在 JVM 内部类所发生的情况的内幕。接着,他将讨论类装入问题,其范围涉及从运行简单的 Java 应用程序所需的类的数量到可能造成 J2EE 及类似的复杂体系结构出现问题的类装入器冲突。

本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性的一系列主题。这些主题的范围从 Java 二进制类文件格式的基本结构,以及使用反射进行运行时元数据访问,一直到在运行时修改和构造新类。贯穿整篇文章的公共线索是这样一种思想:在 Java 平台上编程要比使用直接编译成本机代码的语言更具动态性。如果您理解了这些动态方面,就可以使用 Java 编程完成那些在任何其它主流编程语言中不能完成的事情。

本文中,我将讨论一些基本概念,它们是这些 Java 平台动态特性的基础。这些概念的核心是用于表示 Java 类的二进制格式,包括这些类装入到 JVM 时所发生的情况。本文不仅是本系列其余几篇文章的基础,而且还演示了开发人员在使用 Java 平台时碰到的一些非常实际的问题。

用二进制表示的类

使用 Java 语言的开发人员在用编译器编译他们的源代码时,通常不必关心对这些源代码做了些什么这样的细节。但是本系列文章中,我将讨论从源代码到执行程序所涉及的许多幕后细节,因此我将首先探讨由编译器生成的二进制类。

二进制类格式实际上是由 JVM 规范定义的。通常这些类表示是由编译器从 Java 语言源代码生成的,而且它们通常存储在扩展名为 .class 的文件中。但是,这些特性都无关紧要。已经开发了可以使用 Java 二进制类格式的其它一些编程语言,而且出于某些目的,还构建了新的类表示,并被立即装入到运行中的 JVM。就 JVM 而言,重要的部分不是源代码以及如何存储源代码,而是格式本身。

那么这个类格式实际看上去是什么样呢?清单 1 提供了一个(非常)简短的类的源代码,还附带了由编译器输出的类文件的部分十六进制显示:

清单 1. Hello.java 的源代码和(部分)二进制类文件

public class Hello
{
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
0000: cafe babe 0000 002e 001a 0a00 0600 0c09  ................
0010: 000d 000e 0800 0f0a 0010 0011 0700 1207  ................
0020: 0013 0100 063c 696e 6974 3e01 0003 2829  .....<init>...()
0030: 5601 0004 436f 6465 0100 046d 6169 6e01  V...Code...main.
0040: 0016 285b 4c6a 6176 612f 6c61 6e67 2f53  ..([Ljava/lang/S
0050: 7472 696e 673b 2956 0c00 0700 0807 0014  tring;)V........
0060: 0c00 1500 1601 000d 4865 6c6c 6f2c 2057  ........Hello, W
0070: 6f72 6c64 2107 0017 0c00 1800 1901 0005  orld!...........
0080: 4865 6c6c 6f01 0010 6a61 7661 2f6c 616e  Hello...java/lan
0090: 672f 4f62 6a65 6374 0100 106a 6176 612f  g/Object...java/
00a0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75  lang/System...ou
...

你可能感兴趣的:(java,jvm,数据结构,编程,企业应用)