当前位置: 首页 > 面试题库 >

Java 9中创建了多少个未命名的模块?

谷梁鸣
2023-03-14
问题内容

我试图了解JPMS的工作原理。

从这里

类路径还没有完全消失。类路径上的所有JAR(无论是否模块化)和类都将包含在“未命名模块”中。与自动模块相似,它导出所有软件包并读取所有其他模块。但是,它显然没有名字。因此,命名的应用程序模块无法要求和读取它。未命名的模块又可以访问所有其他模块。

请注意...on the classpath will be contained in the Unnamed Module。模块是单数。

从这里

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

再来一次unnamed module。模块是单数。

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


问题答案:

我是否正确理解,JPMS中始终只有一个未命名的模块?

简而言之

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

更详细

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

正如nullpointer的答案详细解释的那样,默认情况下,应用程序将使用三个单独的类加载器。它可能会启动自己的类加载器,例如加载插件。但是,如果不这样做,所有应用程序代码将最终存储在系统/应用程序类加载器中,因此将存储在相同的未命名模块中。因此,通常只需要关心一个即可。

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

这与代码(应用程序,框架,库)是否以Java 9为目标无关-
它仅取决于放置JAR的路径是类路径还是模块路径。

如果它在类路径中,它将与其他类路径内容一起在未命名模块中结束。对于没有模块描述符的纯JAR,但对于包含一个的模块化JAR,都是如此。

如果在模块路径上,它将获得自己的模块。如果是模块化JAR,它将获得一个显式模块,如整个模块系统状态中所描述的那样-
普通JAR会变成自动模块(请注意复数:每个JAR一个自动模块)。



 类似资料:
  • 我试图了解JPMS是如何工作的。 从这里开始 类路径还没有完全消失。类路径上的所有JAR(模块化或非模块化)和类都将包含在未命名的模块中。与自动模块类似,它导出所有包并读取所有其他模块。但很明显,它没有名字。因此,它不能被指定的应用程序模块所要求和读取。未命名的模块可以依次访问所有其他模块。 请注意。。。在类路径上,将包含在未命名模块中。模块为单数。 从这里开始 为了兼容性,类路径上的所有代码都打

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

  • 更新:我在这里回答了自己的问题: 在Java 9中运行时扫描类路径/模块路径 -- [老问题----过时:] 在Java 9中,如果只给定一个模块对象,那么获取模块引用的正确方法是什么? 考虑以下两种引用的方法: 有一个方法 或ModuleFinder。of系统()。findAll()--您只能从

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

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

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