java启动器_JAVA基础:Java 启动器如何查找类

java启动器_JAVA基础:Java 启动器如何查找类Java启动器java将初始化Java虚拟机。虚拟机随即按以下顺序搜索和加载类:自举类-构成Java平台的类,包括rt.jar和i18n.jar中的类。扩展类-使用Java扩展机制的类。它们被捆绑为.jar文件,位于扩展目录中。用户类-开发人员和第三方定义的类,不使用扩展机制。在命令行上使用-classpath选项(常用方法)或使用CLASSPATH…

大家好,又见面了,我是你们的朋友全栈君。

Java 启动器 java 将初始化 Java 虚拟机。虚拟机随即按以下顺序搜索和加载类:

自举类 – 构成 Java 平台的类,包括 rt.jar 和 i18n.jar 中的类。

扩展类 – 使用 Java 扩展机制的类。它们被捆绑为 .jar 文件,位于扩展目录中。

用户类 – 开发人员和第三方定义的类,不使用扩展机制。在命令行上使用 -classpath 选项(常用方法)或使用 CLASSPATH 环境变量可识别这些类的位置(参见设置 Windows 或 Solaris 的 Classpath)。

实际上,这三个搜索路径将被连为一个简单的类路径。这有点象以前使用的“单级”类路径,但现在的模型有一些重要差别:

偶然“隐藏”或省略自举类相对困难一些。

通常只需指定用户类的位置。系统将“自动”查找自举类和扩展类。

工具类现在位于独立的归档中 (tools.jar)。只有当它包含在用户类路径中时才可用(稍后会有解释)。

Java 启动器如何查找自举类

自举类是实现 Java 1.2 平台的类。自举类在 /jdk1.2/jre/lib 中的 rt.jar 和 i18n.jar 归档中。这些归档由存储在 sun.boot.class.path 系统属性中的自举类路径值指定。该系统属性仅供引用,不应直接修改。

需要重新定义自举类路径的可能性较小。极少数情况下需要使用另一组核心类时,非标准选项 -Xbootclasspath 允许重新定义自举类路径。

注意:实现 JDK 开发工具的类与自举类在不同归档中。工具归档为 /jdk1.2/lib/tools.jar。调用启动器时,开发工具将该归档添加到用户类路径中。然而,这个扩大的用户类路径仅用于执行工具。处理源代码的工具 javac 和 javadoc 将使用初始类路径,而不是扩大后的类路径(有关详细信息,参见下面的 Javac 和 Javadoc 如何查找类)。

Java 启动器如何查找扩展类

扩展类是扩展 Java 平台的类。扩展目录中的每个 .jar 文件即被认为是扩展,且都使用 Java 扩展框架加载。我们不提供改变扩展目录位置的选项。

Java 启动器如何查找用户类

用户类是在 Java 平台上构建的类。查找用户类时,启动器需要使用用户类路径,它是一张目录、JAR 归档和包含类文件的 ZIP 归档的列表。

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

在 Solaris 中,我们用字符串指定用户类路径,而用冒号 (:) 分隔类路径项。java 启动器将用户类路径字符串放置在 java.class.path 系统属性中。该值可能的源为:

缺省值“.”意味着用户类文件是当前目录中的所有类文件(如果是在包中,则为当前目录下的)。

CLASSPATH 环境变量的值,它覆盖缺省值。

命令行选项 -cp 或 -classpath 的值,它覆盖缺省值和 CLASSPATH 值。

-jar 选项指定的 JAR 归档,它覆盖所有其它值。如果使用该选项,则所有用户类都来自指定的归档。

Java 启动器如何查找 JAR-CLASS-PATH 类

JAR 文件通常包含一个“清单” – 该文件列出 JAR 的内容。清单可以定义 JAR-CLASS-PATH ,而后者进一步扩展类路径(仅当从该 JAR 中加载类时)。查找 JAR-CLASS-PATH 访问的类时将按以下顺序进行:

通常,查找 JAR-CLASS-PATH 项引用的类时,即将其当作 JAR 文件的一部分。出现在 JAR-class-path 中的 JAR 文件将在 JAR-CLASS-PATH 前面的类路径项之后及 JAR-CLASS-PATH 后面的类路径项之前进行搜索。

然而,如果 JAR-CLASS-PATH 指向一个已搜索过的 JAR 文件(例如扩展或在类路径前面列出的 JAR 文件),则不再搜索该 JAR 文件(这种优化方式提高了效率,防止了循环搜索)。这样的 JAR 文件将在它出现的地方(类路径中更靠前的地方)进行搜索。

如果 JAR 文件作为扩展安装在 jdk 的 ext 子目录中,则忽略它所定义的 JAR-CLASS-PATH。我们假定扩展所需的所有类都是 JDK 的一部分或已作为扩展安装。

OldJava 启动器如何查找类

oldjava 启动器不支持 Java 扩展框架。下列情况下,它提供向后兼容性:

有一个实现 1.1 风格的安全管理器(与 1.2 类加载方法不兼容)的应用程序,或者

正在加载的类已生成,或以与 1.2 类结构不兼容的方式(例如用模糊器)管理。

(有关这些问题的详细信息,参见 Windows 或 Solaris 的 java 启动器参考页。)

oldjava 启动器在一个类路径中组合了自举类和用户类。用 oldjava 指定类路径的方法有两种:

在 CLASSPATH 环境变量中指定用户类路径。用户类路径加在预定义的自举类路径后。

用命令行选项 -cp 或 -classpath 指定完整的类路径。忽略 CLASSPATH 的值和预定义的自举类路径。

组合类路径存储在 java.class.path 系统属性中。

Javac 和 JavaDoc 如何查找类

javac 和 javadoc 工具使用两种不同方式使用类文件。

象其它 Java 应用程序一样,javac 和 javadoc 必须加载多种类文件才能运行。

要处理它们操作的源代码,javac 和 javadoc 必须获得源代码中所用对象类型的信息。

用来解析源代码引用的类文件大部分和用来运行 javac 和 javadoc 的类文件相同,但有重要的一些例外:

javac 和 javadoc 经常解析对与 javac 或 javadoc 的实现无关的类和接口的引用。有关被引用的用户类和接口的信息可能以类文件、源代码文件或二者结合起来的形式存在。

tools.jar 中的工具类仅用来运行 javac 和 javadoc。工具类不用来解析源代码引用,除非 tool.jar 在用户类路径中。

程序员可能要用另一种 Java 平台实现解析自举类或扩展类引用。利用 -bootclasspath 和 -extdirs 选项,javac 和 javadoc 都可以支持这种操作。使用这些选项不会修改用来运行 javac 或 javadoc 工具本身的类文件集。

如果在类文件和源文件中定义了被引用的类,则 javadoc 通常使用源文件(javadoc 不编译源文件)。同样情况下,javac 使用类文件,但会自动重新编译它认为过期的类文件。自动重新编译的规则将在 javac 文档(Windows 或 Solaris)中介绍。

缺省情况下,javac 和 javadoc 在用户类路径中搜索类文件和源代码文件。如果指定了 -sourcepath 选项,则 javac 和 javadoc 仅搜索指定的源文件路径。

类加载和安全策略

类或接口必须用类加载器加载后才能使用。对特定类加载器的使用确定了与类加载器关联的安全策略。

程序可通过调用类加载器对象的 loadClass 方法加载类或接口,但通常程序仅通过引用方式进行加载。这样就将调用内部类加载器,它对扩展类和用户类应用安全策略。如果未启用安全策略,则所有类都是 “可信任的”。即使启用了安全策略,也不适用于自举类。它永远是“可信任的”。

启用后,系统和用户策略文件将对安全策略进行配置。JDK 软件包括一个系统策略文件,它对扩展类授予“可信任”状态,并对用户类设置基本限制。

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

注意:一些 Java 1.1 平台使用的安全编程技术与 1.2 类加载模型不兼容。为了对已有代码提供临时支持,这一版本包括 oldjava 启动器,它使用 1.1 类加载模型。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156655.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • AVX2 初探

    AVX2 初探Intel最近发布了AVX-512,据说对浮点运算有很大提升,我的机器目前不支持AVX-512,但是支持AVX2,按照之前Intel给出的数据,据说能提速将近8倍:IntroductiontoIntel®AdvancedVectorExtensions测试环境可能这篇文章有点偏老,我这边也想验证一下没有优化的C/C++浮点运算和AVX2优化后的浮点运算到底快多少。这是我机器的配置:Manufacturer GenuineIntelName IntelCorei77820

    2022年5月30日
    90
  • MySQL数据库:读写分离

    MySQL数据库:读写分离

    2021年4月9日
    157
  • 转:不同的行业和工作的真实情况是怎样的?「建议收藏」

    ————————————————————————————————————–不同的行业和工作的真实情况是怎样的?收入、发展前景和挑战如何?这个问题可能会耽误您很多时间,但是,这个问题实在是憋了许久。每个大学生考虑以后从事行业的方式都不同,这

    2022年4月8日
    35
  • javascript实现一个自制网页音乐播放器

    javascript实现一个自制网页音乐播放器序接触简书也有一段日子了,这中间的时光还是比较轻松加愉快的,那种可以和他人分享知识的欣喜和愉悦的确是非常棒。我一向都是觉得专心写自己的文就可以了,不会总是纠结有多少人在看,有多少点击等等。用心写好自己的文,体会那种分享的快乐,就可以了。之前写的《js常用方法和一些封装》系列暂且告一段落,接下来,我会通过各种案例,来分享javascript的各种技巧,所以最终将这个系列的名称定为:《从案例中学习

    2022年6月18日
    28
  • APK签名原理

    APK签名原理网上已有多篇分析签名的类似文章,但是都有一个共同的问题,就是概念混乱,混乱的一塌糊涂。在了解APK签名原理之前,首先澄清几个概念:消息摘要-MessageDigest简称摘要,请看英文翻译,是摘要,不是签名,网上几乎所有android签名分析的文章都对这两个概念乱用摘要的链接http://en.wikipedia.org/wiki/Message_digest简

    2022年6月12日
    30
  • Qt小软件:LanFileSender(局域网文件传输小工具)

    Qt小软件:LanFileSender(局域网文件传输小工具)最近写了一个局域网文件传输小工具,自己用了一段时间了,觉得也稳定了,发出来分享一下。开启后会自动搜索局域网内的主机,然后直接发送文件就可以了。可以设置昵称和存储目录(默认在下载文件夹下)截图:功能详解:File:添加文件Director:添加文件夹Clear:清空文件列表Send:发送文件Ping:发送ping(不是CMD的那个p

    2022年6月3日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号