前 言 本书详细讨论了Java平台面向组件的特性,分析类加载、反射、串行化、本机交互操作及代码生成等技术。 本书对“组件”的定义独特新颖:组件是一个独立的生产和部署单元,可与其他组件结合,以组装应用程序。 对象和组件是不同的概念。对象表示问题域的实体,而组件是被安装解决方案的原子成分 。但对象与组件互为补充,正确的设计应兼顾二者。 Java是备受开发者推崇的现代开发平台,提供了创建类和组件所需要的基础结构。Java提供封装、继承和多态性,以支持面向对象的编程等重要功能。Java还提供加载器和各种类型信息,以支持组件。本书将围绕组件阐述如何有效使用Java的组件基础结构。 Java加载器在运行时定位、加载和连接组件。用Java加载器您可以做如下工作。 ● 部署细粒度组件 ● 根据需要动态加载组件 ● 从网络上的其他计算机加载组件 ● 从自定义存储库加载组件 ● 创建存在于多个虚拟机的移动式代码代理 ● 导入非Java组件的服务 加载器管理组件间的二进制边界。在分布式应用程序和多组件供应商环境中,加载器用于定位和连接所有兼容的组件。 类型信息描述一些代码单元的功能。在某些开发环境中,类型信息仅存在于源代码。而在Java中,类型信息不单纯是一种源代码,还是编译类的内在部分,可在运行时通过编程接口使用。因为Java类型信息从不被“编译掉”,所以加载器使用它在运行时验证类之间的链接。在应用程序编程中,类型信息的作用如下。 ● 串行化Java对象的状态,以便在另一虚拟机上重建对象 ● 在运行时创建动态代理,以提供可用于任何接口的通用服务 ● 将数据转换为另一种表示形式,以与非Java组件交互操作 ● 将方法调用转换成网络消息 ● 在Java和XML之间转换,XML是企业系统的新通用语言 ● 使用应用程序专用元数据为组件添加注释 通过类型信息,可使原本需要手动编码的任务自动实现。此外,类型信息还有助于组件与未来平台的兼容。 读者对象 为了解Java应用程序的整个生存期,不仅要考虑对象,还要考虑组件。本书讨论作为组件平台的Java的核心功能:类加载器,反射,串行化,以及与其他平台的交互操作。本书适用于在Java中设计、开发或部署大量应用程序的读者。在阅读本书前,应了解Java语法的基本知识,并具有一些用Java编写面向对象程序的经验。 本书并未特别介绍高级Java技术,如远程方法调用(Remote Method Invocation, RMI)、企业JavaBean(Enterprise JavaBean,EJB)、JINI、Java服务器页(Java Server Page,JSP)、servlet或JavaBean。但蕴涵的主题是这些技术的重要基础。通过学习本书介绍的组件服务,可以理解这些高级技术的构建原理,从而有效地加以应用。 安全性也是组件开发和部署的一个重要方面。由于篇幅所限,本书未对此做过多介绍。要详细了解Java平台上的安全性,请参见[Gon99](见本书最后的参考书目)。 本书内容 全书分三部分。第1章简要介绍了组件,第2章到第6章解释Java平台上的加载器和类型信息。第7章显示这些服务的更高级使用。 第1章介绍面向组件的编程。不仅在编译时,而且在部署和运行时建立组件的关联。本章提出组件编程的关键问题,并将这些问题与后续章节中讨论的Java平台服务联系起来。在学习本书时,建议您首先阅读第1章,之后可以按自己安排的顺序阅读其他章节。 第2章讨论如何使用类加载器和解决类加载故障。类加载器用于控制代码加载,并在同一进程中创建代码间的命名空间边界。通过类加载器,可在运行时运态加载代码,甚至可以从其他计算机加载。类加载器命名空间允许单个Java虚拟机中有同一个类的多个版本。使用类加载器,可在不关闭虚拟机的情况下重新加载更改的类。本章将介绍如何使用类加载器,类加载器委托模型如何创建命名空间,如何解决类加载故障,以及如何有效控制引导类路径、扩展路径和类路径。 第3章介绍Java类型信息。Java以二进制类格式保存类型信息。这意味着,即使在编译Java程序后,仍可访问字段名、字段类型和方法签名。在运行时可通过反射访问类型信息,可使用类型信息来构建能为其他任何对象添加功能的通用服务。本章将讨论动态调用、动态代理、包反射和自定义属性的用法;还将讨论反射性能。 第4章讨论Java串行化如何使用反射。串行化是一个很好的通用服务示例。不必预先了解类格式的任何知识,串行化可以跨越时间和空间,将代码和状态从一个虚拟机移至另一个虚拟机。学习本章您可以了解到:串行化格式如何嵌入其类型信息样式,如何自定义表示形式;如何扩展默认串行化,如何用自定义外部化代码完全替换,如何调整串行化,以随代码的演变来处理类的多个版本;如何验证反串行化到应用程序的对象,以及如何用指令注解串行化对象,以查找正确的类加载器。 第5章返回到类加载器主题,讨论如何实现自定义类加载器。尽管标准类加载器在大多数应用程序中占据主导地位,但自定义类加载器的作用亦不容忽视。通过自定义类加载器,可在加载类时转换类代码。这些转换包括解密,添加性能监视指令,或甚至在运行时新建类。本章将介绍如何将自定义类加载器绑定到Java安全体系结构,如何编写自定义类加载器,如何编写可自定义加载类(以及其他任何类型资源)方式的协议处理程序。 第6章介绍Java本机接口(Java Native Interface,JNI)。JNI是控制Java代码与在其他环境中编写的组件之间边界的基本方式。Java和本机编程样式存在较大差异,类加载、类型信息、资源管理、错误处理和数组存储的方式等都存在显著区别。Java提供一组低级别工具,将Java对象显示给平台本地代码,和将平台本地代码显示给Java对象。本章介绍如何使用JNI应用程序编程接口(API)实现Java和本机编程样式之间的转换。JNI存在诸多不足,为此,本书编排了附录A以介绍更高级的方法。 第7章讨论使用Java元数据自动创建源代码或字节码。生成代码是一种高性能重用策略,因为您只用生成在运行时需要的准确代码路径。本章首先介绍JSP和EJB,将此作为自动生成代码的已有应用程序示例,然后介绍在自己的程序中生成代码的一些观点。 附录A返回到交互操作主题。在第7章介绍的代码生成技术的基础上,附录A介绍如何在Java和另一组件平台Win32/COM之间创建交互操作层。本章以Jawin开放源库为例,阐释如何为Win32对象生成Java占位程序,或由Java占位程序生成Win32对象。 示例代码、Web站点和反馈 除非特别声明,本书所有示例代码都是开放源代码,可从Web站点下载。 除非特别声明,书中代码都在Java 2 SDK 1.3版本中经过编译和测试。大多数代码也可用于SDK 1.2、1.3和1.4版;若出现特例,本书将列出一个到适当SDK版本的特定引用。 欢迎您对本书提出评论、更正和反馈意见,请将电子邮件发送到stu@develop.com。