如何找到类
Java Launcher 如何查找类
Java Launcher 如何查找 Bootstrap 类
Java Launcher 如何查找扩展类
Java Launcher 如何查找用户类
Java Launcher 如何查找 JAR-class-path 类
Javac 和 Javadoc 如何查找类
类加载和安全策略

Java Launcher 如何查找类
Java 启动程序java启动 Java 虚拟机。虚拟机按以下顺序搜索和加载类:

Bootstrap 类- 构成 Java 平台的类,包括类rt.jar和其他几个重要的 jar 文件。
扩展类- 使用 Java 扩展机制的类。它们被捆绑为.jar位于扩展目录中的文件。
用户类- 由开发人员和第三方定义的不利用扩展机制的类。您可以使用命令行上的-classpath选项(首选方法)或使用 CLASSPATH 环境变量来标识这些类的位置 。(请参阅 为Windows或Unix设置类路径。)
实际上,这三个搜索路径连接起来形成一个简单的类路径。这类似于之前使用的“扁平”类路径,但当前模型有一些重要的区别:

意外“隐藏”或省略引导程序类相对困难。
通常,您只需指定用户类的位置。Bootstrap 类和扩展类是“自动”找到的。
工具类现在位于单独的存档 ( tools.jar ) 中,并且只有包含在用户类路径中才能使用(稍后将进行解释)。

Java Launcher 如何查找 Bootstrap 类
Bootstrap 类是实现 Java 2 平台的类。Bootstrap 类位于rt.jar和 目录中的其他几个 jar 文件中jre/lib。这些档案由存储在sun.boot.class.path系统属性中的引导类路径的值指定。此系统属性仅供参考,请勿直接修改。

您不太可能需要重新定义引导类路径。非标准选项-Xbootclasspath允许您在需要使用不同核心类集的罕见情况下这样做。

请注意,实现 Java 2 SDK 工具的类与引导类位于不同的存档中。工具存档是 SDK 的/lib/tools.jar文件。开发工具在调用启动器时将此存档添加到用户类路径。但是,此增强的用户类路径仅用于执行该工具。处理源代码的工具javac和 javadoc使用原始类路径,而不是增强版本。(有关更多信息,请参阅下面的Javac 和 Javadoc 如何查找类。)

Java Launcher 如何查找扩展类
扩展类是扩展 Java 平台的类。.jar扩展目录jre/lib/ext中的每个文件都 被假定为一个扩展并使用Java 扩展框架加载。将找不到扩展目录中的松散类文件。它们必须包含在.jar文件(或 .zip文件)中。没有提供用于更改扩展目录位置的选项。

如果jre/lib/ext目录包含多个 .jar文件,并且这些文件包含同名的类,例如:

smart-extension1_0.jar contains class smart.extension.Smart
smart-extension1_1.jar contains class smart.extension.Smart

实际加载的类是未定义的。

Java Launcher 如何查找用户类
用户类是构建在 Java 平台上的类。要查找用户类,启动程序会引用用户类路径——包含类文件的目录、JAR 档案和 ZIP 档案的列表。

类文件具有反映类的完全限定名称的子路径名。例如,如果类 com.mypackage.MyClass存储在 下 /myclasses,则/myclasses必须在用户类路径中,类文件的完整路径必须是 / myclasses/com/mypackage/MyClass.class。如果类存储在名为 的存档中myclasses.jar,则 myclasses.jar必须位于用户类路径中,并且类文件必须作为 com/mypackage/MyClass.class.

用户类路径指定为字符串,:在 Solaris 上用冒号 ( ) 分隔类路径条目,;在 Microsoft Windows 系统上用分号 ( ) 分隔条目。在java的启动使用户类路径字符串中的java.class.path 系统属性。该值的可能来源是:

默认值“ .”,表示用户类文件是当前目录(或在它下面,如果在一个包中)中的所有类文件。
该值CLASSPATH环境变量,它覆盖默认值。
所述的值-cp或-classpath命令行选项,这将覆盖这两个默认值和 CLASSPATH值。
由-jar选项指定的 JAR 存档,它会覆盖所有其他值。如果使用此选项,则所有用户类都必须来自指定的存档。

Java Launcher 如何查找 JAR-class-path 类
JAR 文件通常包含一个“清单”——一个列出 JAR 内容的文件。清单可以定义一个 JAR-class-path,它进一步扩展了类路径(但仅限于从该 JAR 加载类时)。JAR-class-path 访问的类按以下顺序找到:

通常,由 JAR-class-path 条目引用的类被发现,就好像它们是 JAR 文件的一部分一样。出现在 JAR-class-path 中的 JAR 文件在任何较早的类路径条目之后搜索,并且在类路径中稍后出现的任何条目之前搜索。
但是,如果 JAR-class-path 指向已搜索过的 JAR 文件(例如,扩展名或类路径中较早列出的 JAR 文件),则不会再次搜索该 JAR 文件。(此优化提高了效率并防止循环搜索。)在此类 JAR 文件出现的位置进行搜索,在类路径中较早。
如果 JAR 文件作为扩展安装,则它定义的任何 JAR 类路径都将被忽略。扩展所需的所有类都被假定为 SDK 的一部分或本身已作为扩展安装。

Javac 和 JavaDoc 如何查找类
该的javac和javadoc的工具,以两种不同的方式使用类文件:

与任何 Java 应用程序一样,javac和javadoc必须加载各种类文件才能运行。
为了处理它们所操作的源代码,javac和 javadoc必须获取有关源代码中使用的对象类型的信息。
用于解析源代码引用的类文件大多与用于运行javac和 javadoc 的类文件相同。但也有一些重要的例外:

双方的javac和javadoc中经常决心类和引用界面,无关与执行的javac和javadoc的。有关引用的用户类和接口的信息可能以类文件、源代码文件或两者的形式存在。
中的工具类tools.jar仅用于运行javac和javadoc。除非tools.jar在用户类路径中,否则工具类不用于解析源代码引用。
程序员可能希望使用替代 Java 平台实现来解析引导类或扩展类引用。javac和javadoc都 通过-bootclasspath和-extdirs选项支持这一点 。使用这些选项不会修改用于运行javac或javadoc工具本身的类文件集 。
如果在类文件和源文件中都定义了引用的类,则javadoc始终使用源文件(javadoc 从不编译源文件)。在相同的情况下,javac使用类文件,但会自动重新编译它确定为过期的任何类文件。自动重新编译的规则记录在Windows或Unix的javac文档中。

默认情况下,javac和javadoc在用户类路径中搜索类文件和源代码文件。如果指定了 -sourcepath选项,则javac和 javadoc仅在指定的源文件路径上搜索源文件,同时仍然在用户类路径中搜索类文件。

类加载和安全策略
要使用,类或接口必须由类加载器加载。特定类加载器的使用确定与类加载器相关联的安全策略。

程序可以通过调用类加载器对象的loadClass方法来加载类或接口 。但通常程序只是通过引用来加载类或接口。这会调用一个内部类加载器,它可以将安全策略应用于扩展类和用户类。如果尚未启用安全策略,则所有类都是“受信任的”。即使启用了安全策略,它也不适用于始终“受信任”的引导程序类。

启用后,安全策略由系统和用户策略文件配置。Java 2 SDK 包含一个系统策略文件,该文件向扩展类授予“受信任”状态并对用户类施加基本限制。

要启用或配置安全策略,请参阅安全功能。

注意:一些适用于 Java 1.1 平台的安全编程技术与 Java 2 平台的类加载模型不兼容。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐