Java9系列第8篇-Module模块化编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第8篇。
在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的也不能被访问。
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
Java9系列第8篇-Module模块化编程的更多相关文章
- Java9系列第7篇:Java.util.Optional优化与增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- Java9系列第6篇-Stream流API的增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- Java9系列第三篇-同一个Jar支持多JDK版本运行
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- 【Windows编程】系列第三篇:文本字符输出
上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接 ...
- 好文推荐系列-------(5)js模块化编程
本文主要来源于阮一峰的<Javascript模块化编程>系列文章整合,原文地址:http://www.ruanyifeng.com/blog/2012/10/javascript_modu ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- 第五篇,理解JS模块化编程思想
模块化编程 ·模块化编程是一种处理复杂系统分解成更好的可管理模块的方式,它可以把系统代码划分为职责单一高度解耦切可替代的模块. ·系统中某一部分的变化将如何影响其他部分就会变得显而易见,系统的可维护性 ...
- Javascript模块化编程(二):AMD规范
Javascript模块化编程(二):AMD规范 作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_d ...
- Javascript模块化编程(一):模块的写法
Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...
随机推荐
- Linux实战(2):Linux传输文件
此次使用的是scp命令,只是针对文件或者文件的传输,并没有什么高端的使用,主要是怕自己忘记了记一下. 传输文件,命令说明:scp+文件路径针确到文件名+账号+上传到另一台的路径并另存为文件名 scp ...
- k8s健康检查(七)
默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness ...
- python温度转换代码分析
将用户输入的温度信息保存在TempStr变量中 if分支条件,判断TempStr类型是否在f及F列表之中 如果用户输入的在f及F列表之中,则用户输入的是一个华氏温度值,对华氏温度进行摄氏温度的转换,e ...
- (专题一)01 matlab基础
功能区:主页,绘图,应用程序 当前文件夹工具栏 命令行窗口:输入命令,按下回车键,会在后面显示执行后的命令 如果命令行很长可以分两行来写,用“...”做续行符 建立当前文件夹:可以用cd命令 例如在d ...
- 实验 3:Mininet 实验——测量路径的损耗率
实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设 定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 实验任务 h0 向 ...
- Pycharm永久激活2且jetbrains全系列产品
Pycharm永久激活2 注意:本教程补丁来源于https://zhile.io,如有侵权请联系作者删除! 本项目只做学习研究之用,不得用于商业用途! 一.激活前注意事项 PyCharm尽量在官网下载 ...
- Spring系列之新注解配置+Spring集成junit+注解注入
Spring系列之注解配置 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率 你本来要写一段很长的代码来构造一个 ...
- Java基础一篇过(三)I/O流总结
一.啥是I/O 概念:I/O为输入,输出流的统称,流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. 本质:本质是数据传输,即数据在两设备间的传输称为流,根据数据传输特性将流抽象为各 ...
- C++解析XML的通用库
工作中,经常和XML打交道,最近抽空实现了一个通用解析XML的库,已归档在GitHub,详情点击:ComXmlLib.如果您无法访问GitHub,点击此处下载(链接是初版,无法和GitHub同步,如需 ...
- [GXYCTF2019]禁止套娃 1 &无参数RCE
[GXYCTF2019]禁止套娃 1 啥都没有那只能上扫描器来一探究竟了. 扫完没有啥结果,但网上找了一下说是git泄露,但是我这里显示了403. <?php include "fla ...