了解扩展类加载
扩展框架利用了类加载委托机制。当运行时环境需要为应用程序加载新类时,它将在以下位置按 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\.jar
,i18n\.jar
或已安装的 extensions 的类中没有找到要加载的类时,才搜索 Classpath。
除非您的软件出于特殊 Object 实例化了自己的类加载器,否则除了记住此优先级列表之外,您实际上不需要了解太多。特别是,您应该注意可能存在的任何类名冲突。例如,如果您在 Classpath 上列出一个类,则如果运行时环境加载与在已安装扩展中找到的相同名称的另一个类,则会得到意外的结果。
Java 类加载机制
Java 平台使用委托模型来加载类。基本思想是每个类加载器都有一个“父”类加载器。加载类时,类加载器首先将对类的搜索“委派”给其父类加载器,然后再try查找类本身。
以下是类加载 API 的一些要点:
-
java\.lang\.ClassLoader
及其子类中的构造函数允许您在实例化新的类加载器时指定父级。如果您未明确指定父级,则会将虚拟机的系统类加载器指定为默认父级。 -
调用
ClassLoader
中的loadClass
方法按 Sequences 执行以下任务: -
如果已经加载了一个类,它将返回它。
-
否则,它将对新类的搜索委托给父类加载器。
-
如果父类加载器找不到该类,则
loadClass
调用方法findClass
来查找和加载该类。 -
如果父类加载器未找到该类,则
ClassLoader
的findClass
方法将在当前类加载器中搜索该类。当您在应用程序中实例化类加载器子类时,您可能想覆盖此方法。 -
类
java\.net\.URLClassLoader
充当扩展和其他 JAR 文件的基本类加载器,它覆盖java\.lang\.ClassLoader
的findClass
方法以在一个或多个指定的 URL 中搜索类和资源。
要查看使用与 JAR 文件相关的一些 API 的示例应用程序,请参阅本教程中的使用与 JAR 相关的 API类。
类加载和 java 命令
Java 平台的类加载机制反映在java
命令中。
-
在
java
工具中,\-classpath
选项是设置java\.class\.path
属性的快捷方式。 -
\-cp
和\-classpath
选项是等效的。 -
\-jar
选项运行打包在 JAR 文件中的应用程序。有关此选项的描述和示例,请参阅本教程中的运行 JAR 打包的软件类。