当前位置: 首页 > 知识库问答 >
问题:

Java9中创建了多少未命名模块?

锺离声
2023-03-14

我试图了解JPMS是如何工作的。

从这里开始

类路径还没有完全消失。类路径上的所有JAR(模块化或非模块化)和类都将包含在未命名的模块中。与自动模块类似,它导出所有包并读取所有其他模块。但很明显,它没有名字。因此,它不能被指定的应用程序模块所要求和读取。未命名的模块可以依次访问所有其他模块。

请注意。。。在类路径上,将包含在未命名模块中。模块为单数。

从这里开始

为了兼容性,类路径上的所有代码都打包为一个特殊的未命名模块,没有隐藏的包,也没有对整个JDK的完全访问。

再次未命名模块。模块为单数。

我是否正确理解JPMS中总是只有一个未命名的模块?这是否意味着在Java9之前开发的、未针对Java9更新的应用程序将作为一个未命名的模块加载?


共有2个答案

沈栋
2023-03-14

我对JPMS中总是只有一个未命名模块的理解正确吗?

是的,有一个未命名的模块。未命名模块与未命名包的现有概念非常相似。

在使用分层文件系统存储包的Java SE平台实现中,一种典型的策略是将一个未命名的包与每个目录相关联;一次只能观察到一个未命名的包,即与“当前工作目录”关联的包。“当前工作目录”的确切含义取决于主机系统。

这是否意味着在Java9之前开发的、未针对Java9更新的应用程序将作为一个未命名的模块加载?

是的,对于那些放置在类路径上的jar,它们将被视为单个未命名模块。具有未命名模块概念的自底向上迁移以类似的示例说明了这一点:

例如,假设上面显示的应用程序最初是为Java SE 8构建的,作为放置在类路径上的一组名称类似的JAR文件。如果我们在Java SE 9上按原样运行,那么JAR文件中的类型将在未命名模块中定义。

这里可能出现的实际问题是,与未命名模块关联的是哪个类装入器?关于未命名模块的模块系统状态对此进行了澄清。

事实证明,每个类加载器都有自己独特的未命名模块,由新的方法getUnnamedModule返回。如果类加载器加载的类型未在命名模块中定义,则该类型被视为在该加载器的未命名模块中,即,该类型的类对象的getModule方法将返回其加载器的未命名模块。那么,通俗地称为“未命名模块”的模块就是应用程序类加载器的未命名模块,当类型位于未由任何已知模块定义的包中时,它会从类路径加载类型。

Java-9中修订的ClassLoader声明:

Java运行时具有以下内置类加载器:

>

  • Bootstrap类加载器:虚拟机的内置类加载器...

    平台类加载器:。。。为了允许升级/重写定义到平台类加载器的模块,如果升级的模块读取定义到平台类加载器及其祖先以外的类加载器的模块,则平台类加载器可能必须委托给其他类加载器,例如应用程序类加载器。换句话说,定义给类加载器(而不是平台类加载器及其祖先)的命名模块中的类可能对平台类加载器可见。

    系统类加载器:它也称为应用程序类加载器,与平台类加载器不同。系统类加载器通常用于定义应用程序类路径、模块路径和JDK特定工具上的类。平台类加载器是所有平台类都可见的系统类加载器的父级或父级。

  • 黄兴业
    2023-03-14

    我对JPMS中总是只有一个未命名模块的理解正确吗?

    简言之

    一般来说,没有。但让我们这样说吧:如果您将一些甚至所有JAR放置在类路径上,并且您的应用程序没有创建类加载器来加载任何附加内容,那么您只需要关心一个未命名的模块。

    更详细地

    每个类加载器都有自己的未命名模块,用于表示从类路径加载的类。这是必要的,因为模块系统要求所有内容都在模块中。

    正如nullpointer的回答详细解释的那样,应用程序在默认情况下将使用三个单独的类加载器。它可能会启动自己的类加载器,例如加载插件。但是,如果不这样做,所有应用程序代码都将在系统/应用程序类加载器中结束,从而在相同的未命名模块中结束。这就是为什么通常只有一个你需要关心的问题。

    这是否意味着在Java9之前开发的、未针对Java9更新的应用程序将作为一个未命名的模块加载?

    这与代码(应用程序、框架、库)是否以Java9为目标无关——它只取决于您将JAR放置在类路径或模块路径上的路径。

    如果它位于类路径上,则它最终与其他类路径内容一起位于未命名模块中。这适用于没有模块描述符的普通JAR,也适用于包含模块描述符的模块JAR。

    如果它位于模块路径上,它将获得自己的模块。如果它是一个模块化的JAR,那么它会得到一个明确的模块,就像在整个模块系统状态中描述的那样——普通JAR会变成自动模块(注意复数:每个JAR一个自动模块)。

     类似资料:
    • 问题内容: 我试图了解JPMS的工作原理。 从这里 类路径还没有完全消失。类路径上的所有JAR(无论是否模块化)和类都将包含在“未命名模块”中。与自动模块相似,它导出所有软件包并读取所有其他模块。但是,它显然没有名字。因此,命名的应用程序模块无法要求和读取它。未命名的模块又可以访问所有其他模块。 请注意。模块是单数。 从这里 为了兼容性,类路径上的所有代码都打包为一个特殊的未命名模块,没有隐藏的包

    • 所以我不确定是0还是2。 如果有人知道请告诉我。

    • 如果我们使用 那么创建了多少对象,它们驻留在哪里?

    • 问题内容: 说我有这个表情 我知道,串池“允许运行时以节省内存在一个池保留不变的字符串” 字符串池 字符串池中将创建多少个字符串? 我最初的猜测是5 -,,,,,因为操作顺序的级联(左到右?),或者是它只是最后的结果,“TomBradyGoat”,存储在字符串池? 问题答案: 在运行时,这段代码将转换为单个对象。编译器将在编译时进行串联,并在常量池中添加一个值。

    • 我厌倦了下面的片段,得到了3个对象和3个引用的答案。但在回答键中说,这是4个对象和3个参考。我不知道是我错了还是回答键错了。请有人帮忙。 我的答案解释: 参考文献:str1、str2、str3。因此引用数=3。 对象:最初创建的对象计数=0。 第1行创建值为Java并引用str1的新对象。对象创建计数=1。 第2行创建值为“GFT”并引用“str2”的新对象。对象创建计数=2。 第3行创建新引用“

    • 问题内容: 我知道这个问题已经被问过多次了。我已经阅读了所有内容,但无法解决问题。以下是我的目录结构。 在main.py中,我将导入以下内容。 当我在Windows中执行代码时,它工作得很好。但是在Linux中,出现以下错误。 我还阅读了有关模块和包的官方python文档。 问题答案: 您的包裹结构还可以。您的导入声明很好。唯一缺少的是该软件包在中是可见的,该位置是可以解析import语句的位置列