Java启动器如何查找类
Java启动器如何查找类Java启动程序Java启动Java虚拟机。虚拟机按以下顺序搜索并加载类:引导类 - 构成Java平台的类,包括类中的rt.jar几个其他重要的jar文件。扩展类 - 使用Java扩展机制的类。这些被捆绑为.jar位于扩展目录中的文件。用户类 - 由开发人员和第三方定义的不利用扩展机制的类。您可以在命令行上使用-classpath选项(首选方法)或使用CLA...
Java启动器如何查找类
Java启动程序Java启动Java虚拟机。虚拟机按以下顺序搜索并加载类:
引导类 - 构成Java平台的类,包括类中的rt.jar几个其他重要的jar文件。
扩展类 - 使用Java扩展机制的类。这些被捆绑为.jar位于扩展目录中的文件。
用户类 - 由开发人员和第三方定义的不利用扩展机制的类。您可以在命令行上使用-classpath选项(首选方法)或使用CLASSPATH环境变量来标识这些类的位置 。(请参阅 为Windows或Unix 设置类路径。)
实际上,这三个搜索路径被连接起来形成一个简单的类路径。这与之前使用的“平坦”类路径类似,但当前模型有一些重要的区别:
意外“隐藏”或省略引导类相对困难。
一般来说,你只需要指定用户类的位置。Bootstrap类和扩展类是“自动”找到的。
这些工具类现在位于单独的存档(tools.jar)中,只有在包含在用户类路径中(稍后才会解释)时才能使用。
Java启动器如何查找引导类
引导类是实现Java 2平台的类。Bootstrap类rt.jar位于jre/lib目录中的其他几个jar文件中。这些归档由存储在sun.boot.class.path系统属性中的bootstrap类路径的值指定。此系统属性仅供参考,不应直接修改。
您将不需要重新定义引导类路径。非标准选项-Xbootclasspath允许您在那些需要使用不同核心类集的罕见实例中执行此操作。
请注意,实现Java 2 SDK工具的类与引导类独立存档。工具归档文件是SDK的/lib/tools.jar文件。在调用启动程序时,开发工具将此归档文件添加到用户类路径中。但是,这种增强的用户类路径仅用于执行该工具。处理源代码的工具javac和 javadoc使用原始类路径,而不是增强版本。(有关更多信息,请参见下面的Javac和Javadoc查找类如何。)
Java Launcher如何查找扩展类
扩展类是扩展Java平台的类。.jar扩展目录中的每个文件 jre / lib / ext都假定为扩展名,并使用Java Extension Framework加载。不会找到扩展目录中的类文件。它们必须包含在.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启动器如何查找用户类
用户类是在Java平台上构建的类。要查找用户类,启动程序引用用户类路径 - 包含类文件的目录列表,JAR归档文件和ZIP归档文件。
类文件具有反映类的完全限定名称的子路径名称。例如,如果该类 com.mypackage.MyClass存储在下面 /myclasses,则/myclasses必须位于用户类路径中,并且类文件的完整路径必须为/ myclasses/com/mypackage/MyClass.class。如果该类存储在名为archive的存档中myclasses.jar,则 myclasses.jar必须位于用户类路径中,并且该类文件必须存储在存档中 com/mypackage/MyClass.class。
用户类路径被指定为一个字符串,其中一个冒号(:)分隔Solaris上的类路径条目,另一个分号(;)分隔Microsoft Windows系统上的条目。在java的启动使用户类路径字符串中的java.class.path 系统属性。这个值的可能来源是:
默认值“ .”,表示用户类文件是当前目录中的所有类文件(如果在包中,则在其下)。
CLASSPATH环境变量的值,该值覆盖默认值。
所述的值-cp或-classpath命令行选项,这将覆盖这两个默认值和 CLASSPATH值。
由-jar选项指定的JAR压缩文件覆盖所有其他值。如果使用此选项,则所有用户类必须来自指定的存档。
Java Launcher如何查找JAR类路径类
JAR文件通常包含一个“清单(manifest)” - 一个列出JAR内容的文件。清单可以定义一个JAR类路径,它进一步扩展了类路径(但仅在从该JAR中加载类时)。由JAR类路径访问的类按以下顺序找到:
一般来说,JAR类路径条目所引用的类就像它们是JAR文件的一部分一样。显示在JAR-class-path中的JAR文件将在任何较早的类路径条目之后以及之后出现在类路径中的任何条目之前进行搜索。
但是,如果JAR类路径指向已被搜索的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包含一个系统策略文件,该文件将“可信”状态授予扩展类,并对用户类进行基本限制。
原文地址:https://docs.oracle.com/javase/8/docs/technotes/tools/findingclasses.html
更多推荐
所有评论(0)