返回顶部
首页 > 资讯 > 后端开发 > Python >Java 9 中的模块Module系统
  • 629
分享到

Java 9 中的模块Module系统

2024-04-02 19:04:59 629人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录Java模块解决了什么问题简化类库真正的访问隔离什么是模块?模块的结构创建模块创建模块规则模块类型系统模块应用程序模块自动模块未命名模块模块描述符文件声明模块导出包定向导出包依赖

Java 的模块在Java 9中正式实装,一直没时间来研究一下这个东西,今天就和大家一起学习一下这个功能。

Java模块解决了什么问题

最近很多同学问我,胖哥,该怎么学习?该学习什么?这里胖哥也穿插说一下。不管学东西,一定要先搞清楚学了有什么用,是学了马上就能用上还是以后有用。我觉得在时间有限的情况下,一定要学当前立马有用的东西。接下来咱们就一起来看看Java模块到底有啥用。

我觉得模块化最大的意义就是按照功能把代码逻辑分割开来,就像你干前端,我写后端,他做测试,把整体大概念拆成小概念,用的时候自由组合,按需引用。事实上确实有这方面的作用,但是不仅仅就这么多。

简化类库

jdk类库目前太臃肿了,在一些微型设备上可能用不到全部的功能,在目前的情况下却不得不引用全部的类库。Java 9引入模块功能后,JDK、JRE、甚至是jar都可以把用不到的类库排除掉,大大降低了依赖库的规模。

真正的访问隔离

在之前只要类是public的,可以直接在整个依赖可传递的范围内访问它。但是很多时候我们需要在某个范围去限制一些类的访问,让这些类具有一些封闭性。在引入模块后,我们就可以做到这些,把一些我们不想暴露的内部实现细节安全地隐藏起来。

什么是模块?

Java 9 引入的模块是在Java包(package)的基础上又引入的一个新的抽象层。基于package这一点很重要,这里需要强调一下。

模块的结构

Java 模块可以由一个或者多个在一起的 Java 包组成。结构可以参考这个图:

创建模块

创建模块需要如下几个步骤:

  • 创建一个文件夹,通常是一个包名,例如cn.felord.module
  • 然后在cn.felord.module下创建一个module-info.java文件,这个文件被称为模块描述符文件。
  • 在模块描述符文件的同级别创建Java包。
  • 最后在创建的包下编写你的Java类文件即可。

创建模块规则

创建模块也必须遵守下面的规则:

模块名称必须是唯一的。

模块描述符文件module-info.java 必须有。

包名称必须是唯一的。即使在不同的模块中,我们也不能有相同的包名。

每个模块将创建一个 jar 文件。对于多个 jar,我们需要创建单独的模块。

一个项目可以由多个模块组成。

模块类型

模块同样还具有类型,一共有四种。

系统模块

来自 JDK 和 JRE 的模块。可以使用 java --list-modules 列出,这里列出了一部分:

❯ .\java.exe --list-modules
java.base@17
java.compiler@17
java.datatransfer@17
java.desktop@17
java.instrument@17
java.logging@17
java.management@17
java.management.rmi@17
# 省略……

应用程序模块

在应用程序中创建以实现功能的所有模块,日常开发如果涉及到模块应该属于这一类。

自动模块

现有的 jar 文件,感觉像兼容旧的类库。它们其实不是模块。当我们将非模块 jar 添加到模块路径时,会创建具有 jar 名称的模块。该模块有以下特性:

  • 默认导出所有包。
  • 默认情况下可以访问所有其他模块的类。

未命名模块

添加到类路径中的 jar 和类。当我们将 jar 或类添加到类路径时,所有这些类都会添加到未命名的模块中

  • 只导出到其他未命名的模块和自动模块。这意味着,应用程序模块无法访问这些类。
  • 它可以访问所有模块的类。

模块描述符文件

一个模块只有一个module-info.java,而且它是有格式要求的,我们来了解一下。

声明模块

我们只需要在module-info.java这样做就能声明一个名称为cn.felord的模块:

module cn.felord {
}

模块名称应该是两个单词以上,并用英文句号.隔开,上面是一个空模块。

导出包

默认情况下,模块里下所有包都是私有的,即使被外部依赖也无法访问,一个模块之内的包还遵循之前的规则不受模块影响。我们可以使用 export 关键字公开特定的包,就像这样:

module cn.felord {
    exports cn.felord.pkg;
    exports cn.felord.util;
}

请注意cn.felord.pkgexports cn.felord.util不能是空包,导出的包必须声明Java对象。

不能导出具体的Java类。

定向导出包

还有一种是定向导出,该包仅仅向某模块公开。就像什么特供酒、特供烟一样。它的语法是:

exports <包名> to <目标模块1>,<目标模块2>,<目标模块3>,...

我们把上面的cn.felord.util定向导出给com.xxx:

module cn.felord {
    exports cn.felord.pkg to com.xxx,com.ooo;
    exports cn.felord.util to com.xxx;
}

在上述情况下,所有模块都可以访问 cn.felord.pkg,但只有com.xxx模块能访问 cn.felord.util

定向导包的作用域是模块。

依赖

如果一个模块要访问从其它模块导出的包,则该模块必须使用requires关键字导入要访问的包所在的模块。就像上面,虽然cn.felord模块向com.ooo开放了cn.felord.pkg包, 即使com.ooo依赖了cn.felord也不能直接使用该包下面的类,需要这样做:

module com.ooo {
    exports com.ooo.pkg;
    // 注释掉 Pkg就变红了 cn.felord.util下面的类无法使用
    requires cn.felord;
}

requires的作用域是模块。

静态依赖

有时我们只在编译时需要一些模块,它们在运行时是可选的。例如,测试或代码生成库。这就需要用到静态导入了,关键字是requires static,例如:

module com.xxx {
       // 移除pom 依赖编译不了
    requires static cn.felord;
}

在此示例中,cn.felord 在编译时是必需的,但在运行时是可选的,有点类似Maven中的<scope>compile</scope>

依赖传递

这看起来越来越像Maven了!a模块依赖b模块,b模块依赖c模块,如果a模块想用c模块公开的包的话,按照前面的规则需要再requires模块c。现在借助于requires transitive就可以这样干,因为b承上启下,我们可以这样:

module b {
    exports b.pkg;
    // 开启依赖传递
    requires transitive  c; 
}

module c {
   exports c.pkg
module a {
   requires b; 

所有依赖b的模块将自动依赖c导出的包,export to定向导出的包优先级最高。

使用服务

使用 uses 关键字,我们可以指定我们的模块需要或使用某些服务。这个服务通常是一个接口或抽象类。它不应该是一个实现类。

module com.xxx {
    requires com.ooo;
    // 移除pom 依赖编译不了
    requires static cn.felord;
    uses com.ooo.pkg.Read;
}

uses只能从模块自己的包中或者requiresrequires static以及requires transitive传递过来的接口或者抽象类。

uses用于指定所需要的服务类或者接口。

给予服务

我们可以通过 provides ... with ...语法,在模块中声明一些服务的实现供其它模块(通过uses)使用。

开放反射

反射 api 的 Java 9 封装和安全性得到了改进。使用反射,我们甚至可以访问对象的私有成员。

从 java 9 开始,默认情况下不打开。我们可以明确地通过open授予其它模块反射权限。

open com.xxx{
}

在这种情况下,com.xxx 模块的所有包都可以使用反射访问。

opens

我们不想全部开放反射访问的话还可以使用opens关键字来指定反射可以访问的包:

module com.xxx{
  opens com.xxx.reflect;
}

opens … to

当然我们还可以将特定的包开放给指定的模块来反射访问:

module com.xxx{
  opens com.xxx.reflect to com.ooo;
}

com.xxx模块的com.xxx.reflect包将开放给com.ooo模块来反射访问。

总结

模块的东西主要是理解,实际运用主要用来系统瘦身、依赖jar级别的隔离。这个自己用Java 9 以上版本建一个多模块的Maven或者Gradle项目,按照上面实验一下就明白了。

到此这篇关于Java 9 的模块(Module)系统的文章就介绍到这了,更多相关Java 9 模块系统内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 9 中的模块Module系统

本文链接: https://lsjlt.com/news/143792.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 9 中的模块Module系统
    目录Java模块解决了什么问题简化类库真正的访问隔离什么是模块?模块的结构创建模块创建模块规则模块类型系统模块应用程序模块自动模块未命名模块模块描述符文件声明模块导出包定向导出包依赖...
    99+
    2024-04-02
  • Node.JS中的模块、exports和module讲解
    目录模块核心模块文件模块基本数据类型引用数据类型exports和module.exports的关系模块 分为两大类 核心模块 由node引擎提供的模块核心模块的标识就是模块的名字 v...
    99+
    2023-01-11
    node.js模块 exports和module node.js exports和module
  • Node.js中的模块系统介绍
    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js ...
    99+
    2024-04-02
  • WPF框架Prism中模块Module用法
    什么是模块(Module) 本质上来说, 对于一个应用程序而言, 特定功能的所有View、Logic、Service等都可以独立存在。那么意味着, 每个独立的功能我们都可以称之为模块...
    99+
    2024-04-02
  • node中的模块系统是什么
    这篇文章主要介绍“node中的模块系统是什么”,在日常操作中,相信很多人在node中的模块系统是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node中的模块系统是什么”...
    99+
    2024-04-02
  • Python中怎么编写辅助模块module
    这篇文章给大家分享的是有关Python中怎么编写辅助模块module的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;...
    99+
    2023-06-14
  • Python语法中的Module模块该如何理解
    Python语法中的Module模块该如何理解,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、定义包含一系列数据,函数,类的文件,通常以.py结尾二、作用让一些相关的数据,函...
    99+
    2023-06-22
  • 怎么实现Java模块化系统的分析
    这篇文章给大家介绍怎么实现Java模块化系统的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java 模块化系统自提出以来经历了很长的时间,直到 2014 年晚些时候才最终以 JSR(JSR-376) 定稿,而且这...
    99+
    2023-06-17
  • python的系统模块builtins快
    python是简单的一门语言,是因为里面存在了很多的模块使用,就好如linux中的也有理解命令的使用“man”、“help”,而python也有。用下面的命令查看>>> dir(__builtins__)>>&...
    99+
    2023-01-31
    模块 系统 python
  • 怎么实现Java模块与inter-module Maven构建测试依赖关系
    这篇文章主要介绍“怎么实现Java模块与inter-module Maven构建测试依赖关系”,在日常操作中,相信很多人在怎么实现Java模块与inter-module Maven构建测试依赖关系问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-06-02
  • Nodejs中的模块系统该如何使用
    本篇文章给大家分享的是有关Nodejs中的模块系统该如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。模块化的背景早期 JavaScrip...
    99+
    2024-04-02
  • node中的模块系统原理是什么
    本篇内容介绍了“node中的模块系统原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!模块系统并不是所有编程语言都有内置的模块系统,J...
    99+
    2023-07-05
  • ASP.NETCoreZero模块系统讲解
    简介 在ABP中, 模板的定义就是一个类, 只需要继承 AbpModule, 该类可以通过nuget包搜索 ABP 安装。 下面演示在应用程序或类库中, 定义一个...
    99+
    2024-04-02
  • erp系统工资模块
    ERP系统工资模块是指企业通过引入一套专门用于管理人力资源的软件系统,来实现对员工薪资、绩效考核、福利待遇等方面的管理和控制。它不仅能够提高企业的管理水平和效率,还能够有效地改善员工的工作环境和福利待遇,从而提高员工的工作积极性和满意度。E...
    99+
    2024-01-19
    模块 工资 系统
  • python开发中module模块用法实例分析
    本文实例讲述了python开发中module模块用法。分享给大家供大家参考,具体如下: 在python中,我们可以把一些功能模块化,就有一点类似于java中,把一些功能相关或者相同的代码放到一起,这样我们需...
    99+
    2022-06-04
    实例 模块 python
  • python中导入logru模块 报错 No module named loguru
    1、导入日志模块异常报错 报错信息: from loguru import logger E   ModuleNotFoundError: No module named  loguru 2、解决方案:安装logru 方案1:pycham...
    99+
    2023-09-01
    python pip 开发语言
  • Module模块化编程的优点有哪些
    这篇文章主要讲解了“Module模块化编程的优点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Module模块化编程的优点有哪些”吧!背景随着前端功能...
    99+
    2024-04-02
  • node.js文件系统模块和两个重要模块
    目录一、node.js文件系统模块node.jsfs文件系统读取文件写入文件二、node.js的两个重要模块path路径模块http模块一、node.js文件系统模块 node.js...
    99+
    2024-04-02
  • python系统信息模块psutil
        psutil模块能够获取系统运行的进程和系统利用率。包括:CPU,内存,磁盘,网络等信息。一般用于系统的监控,分析和限制系统资源和进程的管理。    首先下载安装psutil:wget https://pypi.python.org...
    99+
    2023-01-31
    模块 系统 信息
  • 一文带你了解node中的的模块系统
    本篇文章带大家进行node学习,深入浅出的了解node中的的模块系统,希望对大家有所帮助!两年前写过一篇文章介绍模块系统:理解前端模块概念:CommonJs与ES6Module。这篇文章的知识面都是针对刚入门的,比较浅显。在这也纠正文章的几...
    99+
    2023-05-14
    javascript Node.js node
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作