这篇文章主要为大家介绍了Java9新特性Module模块化编程的示例演绎,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
我计划在接下来的时间里写一系列关于java 9的文章。虽然java 9不像java 8或Java 11那样是核心Java版本,但还是有很多特性值得关注。期待大家的关注,我会把java 9写成系列文章,大概十篇左右。本文为第八篇。
9 java9在接口中定义了私有方法。
java9第9版功能资源自动关闭的语法增强
Java9 version 9的新特性同一个Jar支持多个JDK版本。
java9的新特性:ReactiveStream响应编程API
java9的新特性Collection类的增强和优化方法示例
新Java9特性流API的优化和增强
Java的新特性Java.util.Optional的优化与增强分析
新的Java9特性支持HTTP2协议和非阻塞的HTTPAPI
在Java版本9中,Java语言引入了一个非常重要的概念:模块。如果你熟悉javascript代码的模块化管理,看到Java 9的模块化管理应该会有似曾相识的感觉。
一、什么是Java module?
类似于Java中的package,module引入了另一个层次的Java代码分组。每个这样的模块包含许多子包。在模块的源代码文件包的根目录下,添加一个文件module-info.java,将该文件夹及其子文件夹声明为一个模块。文件语法如下:
module xxx.yyy{ .... }
其中xxx.yyy是模块声明的名称,而不是包名。
二、模块导出package
module-info.java可以指定模块下的哪个包是可见的和可访问的。这个功能是通过一个新的关键字导出来实现的。
module xxx.yyy{ exports com.zimug.java9; }
Com.zimug.java9代表一个包。
注意:即使给定包包中的类是公共的,如果rsquo没有被传递;exportsrsquo显式导出它的包,它们在模块外部也是不可见的(在编译时和运行时)。
三、模块导入package
如果另一个模块想要使用导出的包包中的类,它可以导入(读取)目标模块的包包,并在其module-info.java文件中使用requires关键字。
module def.stu{ requires xxx.yyy;}
四、Java module的意义
在笔者看来,Java 9引入模块模块化管理体系,更多的是从安全性的角度出发。Java代码中90%以上的漏洞都是由反射和访问控制粒度不够造成的。Java 9的模块化系统正好可以解决这个问题。9 Java模块提供了对Java代码的可见性和可访问性的另一层控制。
例如,我们都知道,当一个类被修饰为私有时,就意味着这个类是内部的。对于顶级类(外部类),只有两个修饰符:public和default。这意味着一个问题。我们原本打算在jar包定义的范围内使用一些公共类,但结果是任何引入这个jar的项目都可以使用这个jar中的所有公共类代码。
也就是我们的初衷是提供有限范围内的公众访问,结果却是无限的公众访问。Java 9模块化引入后,可以实现代码公共的有限访问权限,代码公共分为模块外的有限访问和模块内的开放访问。
五、实例
在本例中,我将创建两个模块ldquocommon.widgetrdquo和ldquodata.widgetrdquo,并将它们放在一个文件夹中ldquo模块-示例/src。下去。文件ldquomodule-info . Java rdquo;将放在每个模块的根文件夹下。
文件和目录格式如下:
D:\modules-examplegt;tree /F /A\---src +---common.widget | | module-info.java | | | +---com | | \---zimug | | RendererSupport.java | | | \---org | \---jwidgets | SimpleRenderer.java | \---data.widget | module-info.java | \---com \---example Component.java
第一个模块
此代码文件的目录:
模块-example/src/common . widget/org/jwidgets/simple renderer . Java .
这个包裹以后就不出口了。
package org.jwidgets;public class SimpleRenderer { public void renderAsString(Object object) { System.out.println(object); }}
此代码文件的目录:
模块-example/src/common . widget/com/zimug/renderer support . Java .
这个包裹是后来出口的。
package com.zimug;import org.jwidgets.SimpleRenderer;public class RendererSupport { public void render(Object object) { new SimpleRenderer().renderAsString(object); }}
模块导出,这个代码文件目录:modules-example/src/common . widget/module-info . Java .只导出com.zimug包,不导出org.jwidgets包。导出的模块名是common.widget
module common.widget{ exports com.zimug;}
第二个模块
将模块导入common.widget,代码文件目录:modules-example/src/data . widget/module-info . Java。
module data.widget { requires common.widget;}
在此代码文件的导入模块common.widget路径中使用package:com.zimug:
模块-example/src/data . widget/com/example/component . Java
package com.example;import com.zimug.RendererSupport;public class Component { public static void main(String[] args) { RendererSupport support = new RendererSupport(); support.render("Test Object"); }}
正常编译和执行,结果如下:
Test Object
尝试使用未被exports的package代码
因为套餐ldquoorg.jwidgetsrdquo未通过ldquocommon.widgetrdquo模块导出,那么另一个模块ldquodata.widgetrdquo不能在此包包下使用类SimpleRenderer。让我们举一个反例,看看会发生什么:
package com.example;import org.jwidgets.SimpleRenderer;public class Component { public static void main(String[] args) { SimpleRenderer simpleRenderer = new SimpleRenderer(); simpleRenderer.renderAsString("Test Object"); }}
编译错误消息如下:
D:\modules-example\src\data.widget\com\example\Component.java:3: error: package org.jwidgets is not visibleimport org.jwidgets.SimpleRenderer; ^ (package org.jwidgets is declared in module common.widget, which does not export it)1 error
我们可以看到,包下没有被导出的类,即使是公共的,也是无法访问的。
以上是Java9新特性模块模块化编程实例推演的详细内容。
精彩评论