java.lang.module_java.lang.module

通过解析和服务绑定来支持模块描述符和创建模块配置的类。

除非另有说明,否则将null参数传递给此包中任何类或接口的构造函数或方法将导致抛出NullPointerException 。 此外,除非另行指定,否则使用包含null元素的数组或集合调用方法将导致NullPointerException 。

分辨率是计算模块如何相互依赖的过程。 该过程在编译时和运行时发生。

决议分为两步。 第一步递归枚举一组根模块的'requires'指令。 如果所有枚举模块都是可观察的,那么第二步计算它们的可读性图。 可读性图表体现了模块如何相互依赖,而模块又控制跨模块边界的访问。

第1步:递归枚举

递归枚举采用一组模块名称,查找每个模块声明,并为每个模块声明递归枚举:

'requires'指令给出的模块名称带有'transitive'修饰符,和

根据主机系统的判断,'requires'指令给出的模块名称没有'transitive'修饰符。

模块声明在一组可观察模块中查找。 该组可观察模块以特定于实现的方式确定。 可观察模块集可以包括具有显式声明的模块(即,具有module-info.java源文件或module-info.class文件)和具有隐式声明的模块(即, automatic modules )。 因为自动模块没有明确的模块声明,所以它没有自己的'requires'指令,尽管它的名称可能由显式模块声明的'requires'指令给出。

名称是该算法的初始输入的根模块集以特定于实现的方式确定。 该组根模块可以包括自动模块。

如果此算法枚举了至少一个自动模块,则必须枚举每个可观察的自动模块,无论它们的任何名称是否由显式模块声明的“requires”指令给出。

如果出现以下任何一种情况,则解决方案失败:

任何根模块都是不可观察的。

名称由带有'transitive'修饰符的'requires'指令赋予的任何模块都是不可观察的。

根据主机系统的判断,任何名称由'requires'指令给出而没有'transitive'修饰符的模块是不可观察的。

此步骤中的算法枚举两次相同的模块名称。 这表示'requires'指令中的一个循环,忽略任何'transitive'修饰符。

否则,解析进入步骤2。

第2步:计算可读性图

'requires'指令(不论'传递')表示一个模块依赖于某个其他模块。 'transitive'修饰符的作用是使其他模块也依赖于其他模块。 如果模块M'需要传递N',那么M不仅依赖于N,而且依赖于M的任何模块也依赖于N.这允许M被重构以使其部分或全部内容可以移动到新的模块N没有破坏具有'requires M'指令的模块。

模块依赖性由可读性图表示。 可读性图是有向图,其顶点是步骤1中枚举的模块,其边表示模块对之间的可读性。 边缘指定如下:

首先,可读性由枚举模块的'requires'指令决定,忽略任何'transitive'修饰符:

对于每个枚举模块A,“需要”B:A“读取”B.

对于每个自动的枚举模块X:X“读取”每个其他枚举模块(它“好像”自动模块对每个其他枚举模块都有'requires'指令)。

其次,增加了可读性以解释'传递'修饰符:

对于“读取”B的每个枚举模块A:

如果B'需要传递'C,那么A“读取”C以及B.这种增加是递归的:因为A“读取”C,如果C'需要传递'D,则A“读取”D以及C和B.

如果B是自动模块,则A“读取”每个其他枚举的自动模块。 (它似乎“自动模块”对每个其他枚举的自动模块都要求“传递”指令)。

最后,每个模块都“读取”自己。

如果可读性图中出现以下任何一种情况,则解析失败:

模块“读取”两个或多个具有相同名称的模块。 这包括模块“读取”另一个与其自身名称相同的情况。

两个或多个模块将具有相同名称的包导出到“读取”两者的模块。 这包括包含包“p”的模块M“读取”另一个将p输出到M的模块的情况。

模块M声明它'使用pS'或'提供pS与...'但是包p既不在模块M中也不由M“读取”的任何模块导出到M.

否则,分辨率成功,分辨率的结果是可读性图。

根模块

编译时的根模块集通常是正在编译的模块集。 在运行时,根模块集通常是为'java'启动器指定的应用程序模块。 在未命名模块中编译代码时,或者在从类路径加载主应用程序类时的运行时,默认的根模块集是特定于实现的。 在JDK中,默认的根模块集包含在升级模块路径上或系统模块中可观察的每个模块,并且无需限定即导出至少一个包。

可观察的模块

在编译时和运行时的可观察模块集是通过搜索几个不同的路径,以及通过搜索内置到环境中的已编译模块来确定的。 搜索顺序如下:

仅在编译时,编译模块路径。 此路径包含源表单中的模块定义。

升级模块路径。 此路径包含模块的已编译定义,这些模块将优先于(3)和(4)中存在的任何可升级模块的已编译定义进行观察。 请参阅Java SE Platform以了解哪些标准模块可升级。

系统模块,它是内置于环境中的编译定义。

应用程序模块路径。 此路径包含库和应用程序模块的已编译定义。

'requires'指令带有'static'修饰符

'requires'指令使'static'修饰符在运行时表达可选的依赖关系。 如果模块声明它“需要静态M”,则解析不会在可观察模块中搜索M以满足依赖性。 但是,如果在步骤1中递归枚举M,那么枚举的所有模块和“需要静态M”将读取M.

完整性

在编译时,解析可能是部分的,因为编译一组模块可能不需要完整的传递闭包。 最低限度,在编译时构造和验证的可读性图包括正在编译的模块,它们的直接依赖性以及所有隐式声明的依赖性(需要传递)。

在运行时,分辨率是一个附加过程。 步骤1中的递归枚举可以相对于先前的分辨率,以便在由先前(或父)分辨率枚举时,不枚举根模块或在'requires'指令中命名的模块。 因此,作为分辨率结果的可读性图可以具有在步骤1中枚举的模块的顶点,但具有边缘以表示模块读取由先前(或父)分辨率枚举的模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: java.lang.module.FindException 是 Java 模块化系统的一部分,它表示在模块查找期间出现问题的异常。通常,这个异常被抛出是因为 Java 运行时无法找到需要的模块或者在解析依赖关系时出现了问题。 这个异常可以有多种原因,例如: - 找不到指定的模块。 - 模块无法被加载或者它的描述文件中有错误。 - 模块的版本号与运行时所需的版本号不匹配。 - 模块之间的依赖关系无法被解决。 如果您遇到了这个异常,可以考虑检查以下几点: - 检查模块路径或者类路径是否正确。 - 检查模块描述文件是否存在或者是否有错误。 - 检查模块之间的依赖关系是否正确。 如果您仍然无法解决问题,可以尝试在调试模式下运行程序,以便更好地理解问题所在。同时,也可以参考 Java 官方文档或者相关论坛来寻求帮助。 ### 回答2: java.lang.module.FindException是Java中的一个异常类,用于表示模块发现失败的异常情况。 模块是在Java 9及以后版本中引入的一种新的组织Java类的方式。通过模块化,可以将Java程序拆分成更小、更独立的单元,以便更好地管理和组织代码。Java模块的引入可以提高可维护性、可复用性和安全性。 当出现java.lang.module.FindException异常时,表示在查找并加载某个模块时出现了错误。可能的原因包括: 1. 模块不存在:如果指定的模块不存在,就会抛出FindException异常。 2. 模块路径错误:模块的查找是通过指定模块路径进行的。如果指定的模块路径不正确或无法访问,就会导致模块查找失败。 3. 模块依赖关系错误:模块之间可以存在依赖关系,即一个模块可以依赖其他模块。如果模块的依赖关系错误或无法满足,就可能导致模块查找失败。 解决FindException异常的方法包括: 1. 确保指定的模块存在并位于正确的位置。 2. 检查并修复模块路径配置,确保可以正确访问模块。 3. 检查模块之间的依赖关系,并修复可能的错误或冲突。 总之,java.lang.module.FindException是一个表示模块查找失败的异常类,在使用Java模块化功能时可能会遇到。通过检查模块是否存在、模块路径配置和模块依赖关系等,可以解决这个异常。 ### 回答3: java.lang.module.FindException是Java中一个异常类,它表示模块查找失败的异常情况。模块在Java 9及以上版本中引入,用于更好地组织和管理Java应用程序的代码。 当程序在运行过程中需要加载一个模块(module),但是无法找到该模块时,就会抛出java.lang.module.FindException异常。这种情况可能有以下几种原因: 1. 模块路径错误:在运行Java程序时,需要通过--module-path选项指定模块路径,但是可能指定的路径不正确或者不存在,导致无法找到相应的模块。 2. 模块依赖关系错误:在模块化的Java应用程序中,模块之间可以存在依赖关系,一个模块可能依赖于其他模块。如果需要的依赖模块缺失或者无法找到,就会导致模块查找失败异常。 3. 模块命名冲突:如果存在多个模块命名冲突,即存在多个模块具有相同的模块名称,就会导致模块查找失败异常。 解决这个异常的方法包括: 1. 检查模块路径是否正确,并确保指定的模块路径中包含了所需的模块。 2. 检查模块之间的依赖关系是否正确,并确保依赖的模块已经存在或者被正确地导入。 3. 解决模块命名冲突问题,确保每个模块具有唯一的模块名称。 总之,java.lang.module.FindException是一个表示模块查找失败的异常类,它通常发生在模块化的Java应用程序中,可以通过检查模块路径、模块依赖关系和模块命名等方面来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值