网站首页 > 技术文章 正文
隐含依赖(Implicit Readability)
如果一个模块A依赖另一个模块B,而另一个模块B依赖于模块C,这样模块A就隐含依赖于C。 每个模块都隐含依赖java.base模块。 隐含依赖不限于java.base模块。 模块也可以隐含依赖另一个模块,而不是java.base模块。 在展示如何向模块添加隐含之前,先构建一个示例,看看为什么我们需要这个功能。
在上一节中,创建了两个名为com.jdojo.address和com.jdojo.person的模块,其中第二个模块使用以下声明读取第一个模块:
module com.jdojo.person { requires com.jdojo.address; }
com.jdojo.person模块中的Person类引用com.jdojo.address模块中的Address类。 让我们创建另一个名为com.jdojo.person.test的模块,它读取com.jdojo.person模块。 模块声明如下所示。
module com.jdojo.person.test {
requires com.jdojo.person;
}
需要将com.jdojo.person项目添加到com.jdojo.person.test项目的模块路径。 否则,编译代码将产生错误。
然后,在com.jdojo.person.test项目中添加主类。
package com.jdojo.person.test; import com.jdojo.person.Person; public class Main { public static void main(String[] args) { Person john = new Person(1001, "John", "Jacobs"); // Get John's city and print it String city = john.getAddress().getCity(); System.out.printf("John lives in %s%n", city); } }
上面的代码会出现以下错误信息:
E:\Java\com.jdojo.person.test\src\com\jdojo\person\test\Main.java:16: 错误: 无法访问Address
String city = john.getAddress().getCity();
找不到com.jdojo.address.Address的类文件
错误原因在于com.jdojo.person.test模块不能访问Address类。 Address类在com.jdojo.address模块中,com.jdojo.person.test模块没有访问模块。 看代码,似乎很明显代码应该编译成功。 既然可以使用Person类; 所以就应该可以使用Address类。 这里,john.getAddress()方法返回一个无权访问的Address类型的对象。 模块系统只是对com.jdojo.address模块定义进行了封装。 如果模块想要明确或者隐式地使用Address类,它必须读取com.jdojo.address模块。 如何解决? 简单的答案是com.jdojo.person.test模块通过将其声明模块来读取com.jdojo.address模块。
// module-info.javamodule com.jdojo.person.test { requires com.jdojo.person; requires com.jdojo.address; }
上面的模块定义会收到另一个错误,该错误将声明未找到com.jdojo.address模块。 将com.jdojo.address项目添加到com.jdojo.person.test项目的模块路径来修复此错误。 模块路径设置如下所示。
此时,显示了com.jdojo.person.test模块的模块图。
在com.jdojo.person.test模块中编译并运行Main类。 它将打印以下内容:
到目前为止,我们通过添加requires语句解决了问题,但是其他使用Person类的的模块同样需要添加requires语句,这种语句是非常臃肿的。Java9的设计师意识到这个问题并且提供了一个简单的方法解决这个问题。目前,你所有需要做的改变就是给com.jdojo.person的模块定义语句中的requires添加一个transitive表示,表示对com.jdojo.address的传递依赖。
module com.jdojo.person {
requires transitive com.jdojo.address;
exports com.jdojo.person;
}
现在我们可以从移除requires com.jdojo.address;这个语句,重新编译结果完全正确。
从模块图中发现,这样实现了传递依赖。
猜你喜欢
- 2024-10-18 MyBatisPlus又在搞事了!发布神器,一个依赖轻松搞定权限问题
- 2024-10-18 史上硬核!Jar 包依赖冲突排查思路和解决方法
- 2024-10-18 小白都能看懂的 Spring 源码揭秘之依赖注入(DI)源码分析
- 2024-10-18 Spring-bean的循环依赖以及解决方式
- 2024-10-18 Maven技术方案最全手册 maven详细教程
- 2024-10-18 JAVA编程规范之二方库依赖 java方法库
- 2024-10-18 Spring依赖注入原理分析 spring依赖注入作用
- 2024-10-18 简单2步实现maven打包java工程并将依赖jar输出到指定目录
- 2024-10-18 怎么进阶学好Java 如何用Spring解决循环依赖
- 2024-10-18 Spring 源码分析之 bean 依赖注入原理(注入属性)
你 发表评论:
欢迎- 11-19零基础学习!数据分析分类模型「支持向量机」
- 11-19机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现
- 11-19我以前一直没有真正理解支持向量机,直到我画了一张图
- 11-19研一小姑娘分享机器学习之SVM支持向量机
- 11-19[机器学习] sklearn支持向量机
- 11-19支持向量机
- 11-19初探支持向量机:用大白话解释、原理详解、Python实现
- 11-19支持向量机的核函数
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)