我打算在后续的一段时间内,写一系列对于 java 9 的文章,尽管 java 9 不像 Java 8 或者 Java 11 那样的外围 java 版本,然而还是有很多的个性值得关注。期待您能关注我,我将把 java 9 写成一系列的文章,大略十篇左右,本文是第 8 篇。
- java9 系列文章拜访地址
在 Java 9 版本中 Java 语言引入了一个十分重要的概念:模块(module)。如果对 javascript 代码模块化治理比拟相熟的小伙伴,看到 Java 9 的模块化治理,应该有似曾相识的感觉。
一、什么是 Java module?
与 Java 中的 package 有些相似,module 引入了 Java 代码分组的另一个级别。每个这样的分组(module)都蕴含许多子 package 包。通过在一个模块的源代码文件 package 的根部,增加文件 module-info.java 来申明该文件夹及其子文件夹为一个模块。该文件语法如下:
module xxx.yyy{....}
其中 xxx.yyy 是模块 module 申明的名称,不是 package 名称。
二、模块导出 package
文件 module-info.java 能够指定该模块上面的哪些 package 对外可见、可拜访。通过一个新的关键字 exports
来实现该性能。
module xxx.yyy{exports com.zimug.java9;}
com.zimug.java9
代表一个 package。
须要留神的是:即便给定 package 包中的类是 public 的,如果未通过 ’exports’ 显式导出其程序包,则它们在模块内部也是不可见的(在编译时和运行时都是如此)。
三、模块导入 package
如果另一个模块想要应用被导出的 package 包中的类,能够用 requires
关键字在其 module-info.java 文件中来导入(读取)指标模块的 package 包。
module def.stu{requires xxx.yyy;}
四、Java module 的意义
在笔者看来,Java 9 引入 module 模块化管理系统,更多的是从安全性的角度思考。Java 代码中 90% 以上的破绽都是由反射和拜访权限管制粒度有余引起的,Java 9 的模块化零碎正好能解决这个问题。Java 9 module 提供另一个级别的 Java 代码可见性、可拜访性的管制。
比如说:咱们都晓得当一个 class 被润饰为 private 的时候,意味着这个类是外部类。对于顶级类 (外部类) 来说,只有两种修饰符:public 和默认(default)。这也就意味着一个问题,有些 public class 咱们原本是打算在 jar 包定义的范畴内应用的,然而后果却是任何引入了这个 jar 的我的项目都能够应用这个 jar 外面所有的 public class 代码。
也就是咱们的原意是在无限范畴内提供公开拜访,后果却是无限度的对外公开。在引入 Java 9 模块化之后,能够实现 无限范畴内的代码 public 拜访权限 ,将代码公开辨别为: 模块内部无限范畴的公开拜访 和模块外部的公开拜访。
五、实例
在此示例中,我将创立两个模块“common.widget”和“data.widget”,并将它们搁置在单个文件夹“modules-examples/src”下。文件“module-info.java”将搁置在每个模块的根文件夹下。
文件及目录格局如下:
D:\modules-example>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
第一个模块
本代码文件目录:modules-example/src/common.widget/org/jwidgets/SimpleRenderer.java。这个 package 在后文中没有被 exports。
package org.jwidgets;
public class SimpleRenderer {public void renderAsString(Object object) {System.out.println(object);
}
}
本代码文件目录:modules-example/src/common.widget/com/zimug/RendererSupport.java。这个 package 在后文中被 exports 了。
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
。本代码文件门路:modules-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 代码
因为包“org.jwidgets”尚未通过“common.widget”模块导出,因而另一个模块“data.widget”无奈应用该 package 包下的类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 visible
import org.jwidgets.SimpleRenderer;
^
(package org.jwidgets is declared in module common.widget, which does not export it)
1 error
正如咱们所看到的,未被 exports 的 package 上面的 class 即便是 public 的也不能被拜访。
欢送关注我的博客,外面有很多精品合集
本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学 Spring Boot2.0》
- 《Spring Security-JWT-OAuth2 一本通》
- 《实战前后端拆散 RBAC 权限管理系统》
- 《实战 SpringCloud 微服务从青铜到王者》
- 《VUE 深入浅出系列》