了解扩展类加载

扩展框架利用了类加载委托机制。当运行时环境需要为应用程序加载新类时,它将在以下位置按 Sequences 查找该类:

  • 引导程序类:rt\.jar中的运行时类,i18n\.jar中的国际化类,以及其他。

  • 已安装的扩展 :JRE 的lib/ext目录中以及系统范围内特定于平台的扩展目录(例如 Solaris™os 上的/usr/jdk/packages/lib/ext)中 JAR 文件中的类,但是请注意,使用此目录适用仅适用于 Java™6 和更高版本)。

  • Classpath :系统属性java\.class\.path指定的路径上的类,包括 JAR 文件中的类。如果 Classpath 上的 JAR 文件具有带有Class-Path属性的清单,则还将搜索Class-Path属性指定的 JAR 文件。默认情况下,java.class.path属性的值为.,即当前目录。您可以使用\-classpath\-cp命令行选项或设置CLASSPATH环境变量来更改值。命令行选项将覆盖CLASSPATH环境变量的设置。

例如,优先级列表告诉您,只有在rt\.jari18n\.jar或已安装的 extensions 的类中没有找到要加载的类时,才搜索 Classpath。

除非您的软件出于特殊 Object 实例化了自己的类加载器,否则除了记住此优先级列表之外,您实际上不需要了解太多。特别是,您应该注意可能存在的任何类名冲突。例如,如果您在 Classpath 上列出一个类,则如果运行时环境加载与在已安装扩展中找到的相同名称的另一个类,则会得到意外的结果。

Java 类加载机制

Java 平台使用委托模型来加载类。基本思想是每个类加载器都有一个“父”类加载器。加载类时,类加载器首先将对类的搜索“委派”给其父类加载器,然后再try查找类本身。

以下是类加载 API 的一些要点:

  • java\.lang\.ClassLoader及其子类中的构造函数允许您在实例化新的类加载器时指定父级。如果您未明确指定父级,则会将虚拟机的系统类加载器指定为默认父级。

  • 调用ClassLoader中的loadClass方法按 Sequences 执行以下任务:

  • 如果已经加载了一个类,它将返回它。

  • 否则,它将对新类的搜索委托给父类加载器。

  • 如果父类加载器找不到该类,则loadClass调用方法findClass来查找和加载该类。

  • 如果父类加载器未找到该类,则ClassLoaderfindClass方法将在当前类加载器中搜索该类。当您在应用程序中实例化类加载器子类时,您可能想覆盖此方法。

  • java\.net\.URLClassLoader充当扩展和其他 JAR 文件的基本类加载器,它覆盖java\.lang\.ClassLoaderfindClass方法以在一个或多个指定的 URL 中搜索类和资源。

要查看使用与 JAR 文件相关的一些 API 的示例应用程序,请参阅本教程中的使用与 JAR 相关的 API类。

类加载和 java 命令

Java 平台的类加载机制反映在java命令中。

  • java工具中,\-classpath选项是设置java\.class\.path属性的快捷方式。

  • \-cp\-classpath选项是等效的。

  • \-jar选项运行打包在 JAR 文件中的应用程序。有关此选项的描述和示例,请参阅本教程中的运行 JAR 打包的软件类。