background image

  如果希望使用特定主机上的资源,它们又无法从 Java API 访问,那么可
以写一个平台相关的 Java 程序来调用本地方法。如果希望保证程序的平台无
关性,那么只能通过 Java API 来访问底层系统资源。

  类装载器的体系结构

  一个 Java 应用程序可以使用两种类装载器:"启动(bootstrap)"类装载器
和用户定义的类装载器。启动类装载器(这是系统中唯一的)是 Java 虚拟机实现
的一部分。启动类装载器通常使用某种默认方式从本地磁盘中装载类,包括
Java API 类(启动类装载器也被称为原始类装载器、系统类装载器或者默认类
装载器)。

  Java 应用程序能够在运行时安装用户定义的类装载器,这种类装载器能
够使用自定义的方式来装载类。例如,从网络下载 class 文件。尽管启动类装载
器是虚拟机实现的本质部分,而用户定义的类装载器不是,但用户定义的类
装载器能够用 Java 来编写,能够被编译成 class 文件,能够被虚拟机装载,还
能够像其它对象一样实例化。

  由于有用户定义类装载器,所以不必再编译的时候就知道运行中的 Java
应用程序中最终会加入的所有的类。用户定义的类装载器使得在运行扩展 Java
应用程序成为可能。当它运行时,应用程序能够解决它需要哪些额外的类,能
够决定是使用一个或是更多的用户定义的类装载器来装载。由于类装载器是用
Java 编写的,所以用任何在 Java 代码中可以表述的风格来进行类装载。这些
类可以通过网络下载,可以从某些数据库中获取,甚至可以动态生成。

  每一个类被装载的时候,Java 虚拟机都监视这个类,看到它到底是被启
动类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,
虚拟机就会使用装载第一个类的类装载器装载引用的类。例如,如果虚拟机使
用一个特定的类装载器装载 Volcano 这个类,它就会使用这个类装载器装载
Volcano 类使用的所有类。

  由于 Java 虚拟机采取这种方式进行类的装载,所以被装载的类默认情况
下只能看到被同一个类装载器装载的别的类。通过这种方法,Java 的体系结构
允许在一个 Java 应用程序中建立多个命名空间。运行时的 Java 程序中的每一
个类装载器都有自己的命名空间。

  Java 应用程序可以创建多少个(或多少种)被不同的类装载器装载的类存
放在不同的命名空间中,它们不能相互访问,除非应用程序显示地允许这么
做。当编写一个 Java 应用程序的时候,从不同源文件装载的类可以分隔在不
同的命名空间中。通过这种方法,就能够使用 Java 类装载器的体系结构来控
制任何不同源文件中装载的代码之间的相互影响,特别是能够阻止恶意代码
获取访问或破坏善意代码的权限。