目标
使用模块(module)来清楚的描述组件之间的依赖关系,而不是jar;<br>使用新的module-path来解决类路径(classpath)管理的不足。<br>
提供了更强大的代码封装性:<br>在Java 9 中,模块之间的关系被称为“可读性”(readability),实际代码中一个类型对于另外一个类型的调用被称为“可访问性“(accessablity),即private、默认、protected、public访问修饰符。<br><b>可访问性的前提是可读性。因此public访问修饰符不再意味着具有可访问性了</b>。
模块声明:增加一个module-info.java文件描述模块信息。<br>模块声明中可以包含零个或多个模块语句。包括以下五种类型:<br>1、(模块)导出语句(exports statement)<br>2、(模块)打开语句(opens statement)<br>3、(模块)导入语句(requires statement)<br>4、(服务)使用语句(uses statement)<br>5、(服务)提供语句(provides statement)<br>
<h4 id="模块的访问控制"><b>1、模块访问控制<br></b>exports 和 opens 语句用于控制外部对模块代码的访问,其表达形式如下:<br></h4><i>exports <package>;<br>exports <package> to <module1>, <module2>...;<br>opens <package>;<br>opens <package> to <module1>, <module2>...;<br></i>exports 语句允许仅在编译时和运行时访问指定包的公共API;<br>而 opens 语句允许在运行时使用反射访问指定包中的所有类型的公共和私有成员
<b>2、声明模块间依赖关系</b><br>requires 语句用于声明模块对另一个模块的依赖关系,其表达形式如下:<br><i>requires <module>;<br>requires transitive <module>;<br>requires static <module>;<br>requires transitive static <module>;</i><br>其中的<i> static </i>修饰符表示在编译时的依赖是强制的,但在运行时是可选的;<br><i>transitive</i> 修饰符会导致依赖于当前模块的其他模块具有隐式依赖性(传递依赖)。<br>
<b>3、服务配置</b><br>uses 和 provides 语句分别用于表达服务消费和服务提供(用于SPI,即 Service Provider Interface 机制),其表达形式如下:<br><i>uses <service-interface>;<br>provides <service-interface> <br> with <service-impl-class1>, <service-impl-class2>...;</i>
如 <br>module test { <br> exports com.example.test; <br> requires main;<br> }