【java9】java9新特性之模块化

Java9模块化是Java9版本中引入的一个重要特性,通过Java Platform Module System (JPMS)实现。这个特性允许开发者将大型应用程序拆分成相互独立的模块,每个模块包含一组相关的功能和资源。

关键概念与语法

下面是Java9模块化的一些关键概念和语法:

  • 模块(Module):模块是一组相关的包的集合,它们被组织在一起以实现高内聚性和低耦合性。每个模块都有一个唯一的名称,通过module-info.java文件来声明模块的信息。

  • 模块声明:在每个模块的根目录下创建module-info.java文件,使用module关键字声明模块,指定模块的名称、依赖关系和导出的包等信息。

  • 模块路径:模块路径是用来指定模块的位置的路径。在编译和运行时,可以使用–module-path选项指定模块路径,告诉Java编译器和运行时在哪里查找模块。

  • 模块间依赖:通过requires关键字声明模块之间的依赖关系,确保在编译和运行时正确加载依赖的模块。

  • 导出包:使用exports关键字导出包,使得其他模块能够访问该包中的类。可以通过to关键字限制只有特定模块可以访问导出的包。

  • 开放包:使用opens关键字开放包,允许其他模块通过反射访问该包中的类。

  • 模块化编译和运行:使用javac编译器和java命令运行模块化的Java应用程序,需要在命令行中指定模块路径和要运行的模块。

模块化的优势:

  • 更好的封装性:模块化强制隐藏内部实现细节,只暴露必要的API接口,这增强了封装性,降低了模块间的耦合度。
  • 可维护性:通过将应用程序拆分成多个模块,每个模块都可以独立地进行开发和测试,从而提高了可维护性。
  • 性能优化:模块系统可以更有效地加载和管理类,从而可能提高应用程序的性能。

模块化的使用

以下是一个简单的Java9模块化的使用例子:

假设我们有一个Java项目,其中包含两个模块:main(主模块)和user(用户模块)。主模块需要使用用户模块中的某个类(比如User类)。

创建目录结构

首先,我们需要创建项目的目录结构。在这个例子中,我们将有两个模块,所以目录结构如下所示:

java9-module-demo/
├── main
│   ├── module-info.java
│   └── src
│       └── com
│           └── morris
│               └── main
│                   └── Main.java
└── user├── module-info.java└── src└── com└── morris├── other│   └── HiddenClass.java└── user└── User.java

编写模块描述符(module-info.java)

在每个模块的根目录下,我们需要创建一个module-info.java文件来定义模块。

对于main模块(主模块):

// main/module-info.java  
module main {requires user; // 声明对用户模块的依赖
}

对于user模块(用户模块):

module user {exports com.morris.user; // 声明导出com.morris.user包,以便其他模块可以访问它// 注意:我们没有导出HiddenClass类所在的包,所以其他模块不能访问它
}

编写Java类

在main模块的Main.java文件中:

// main/src/com/morris/main/Main.java  
package com.morris.main;import com.morris.user.User;public class Main {public static void main(String[] args) {User user = new User(); // 创建User类的实例System.out.println("Hello, " + user.getName()); // 假设User类有一个getName()方法}}

在user模块的User.java文件中:

// user/src/com/morris/user/User.java 
package com.morris.user;public class User {private static final String NAME = "Morris";public String getName() {return NAME;}
}

注意:HiddenClass.java在这个例子中没有被使用,并且由于它所在的包没有被导出,所以com.morris.main模块不能访问它。

如果在com.morris.main模块访问HiddenClass,编译时会抛出以下的错误:

main/src/com/morris/main/Main.java:3: error: package com.morris.other is not visible
import com.morris.other.HiddenClass;^(package com.morris.other is declared in module user, which does not export it)
1 error

编译

先编译user模块:

$ javac -d out/user  user/module-info.java user/src/com/morris/user/Us
er.java user/src/com/morris/other/HiddenClass.java

后编译main模块:

$ javac -d out/main --module-path out/user main/module-info.java main/src/com/morris/main/Main.java

编译后目录结构如下:

java9-module-demo/
├── main
│   ├── module-info.java
│   └── src
│       └── com
│           └── morris
│               └── main
│                   └── Main.java
├── out
│   ├── main
│   │   ├── com
│   │   │   └── morris
│   │   │       └── main
│   │   │           └── Main.class
│   │   └── module-info.class
│   └── user
│       ├── com
│       │   └── morris
│       │       ├── other
│       │       │   └── HiddenClass.class
│       │       └── user
│       │           └── User.class
│       └── module-info.class
└── user├── module-info.java└── src└── com└── morris├── other│   └── HiddenClass.java└── user└── User.java

运行

通过--module-path选项指定模块路径,告诉Java运行时在哪里查找模块:

$ java --module-path out --module main/com.morris.main.Main
Hello, Morris

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次使用Notepad++正则表达式批量替换SQL语句

目录 一、需求二、解决方案三、正则解析 一、需求 存在如下SQL建表脚本: CREATE TABLE "BUSINESS_GOODS" ( "ID" VARCHAR(32) NOT NULL, "GOODS_CODE" VARCHAR(50), "GOODS_NAME" VARCHAR(100), ... NOT CLUSTER PRIMARY…

selenium之document.querySelector()方法

document.querySelector()方法 1. 常用的三种获取元素的js方式 document.getElementById("");document.getElementsByClassName();document.getElementsByTagName(); var docdocument;var boxdoc.getElementById("box");var libox.getElementsByTagName(…

Ceph PG

概述 为了实现不同存储池之间的策略隔离,以及针对不同用途的存储池指定不同的容灾策略,ceph crush使用中间结构即Placement Group(后续均以PG简称)将应用数据对象进行映射后,写入OSD本地存储设备。PG也是我们日常运维…

常见的 HTML 标准

常见的 HTML 标准 常见的 HTML 标准发布历史 HTML(Hypertext Markup Language)有多个版本和标准。以下是一些常见的 HTML 标准: HTML 2.0:于1995年发布,是 HTML 的第一个正式标准。HTML 3.2:于1997年发布…

刷代码随想录有感(50):路径总和

题干: 代码; class Solution { public:bool traversal(TreeNode* node, int count){if(node NULL)return false;if(!node -> left && !node -> right && count 0)return true;if(!node -> left && !node -> right &&…

python挑战10秒小程序

目录 一.前言 二.代码 三.分析 一.前言 >1.小程序开始时,会出现一个倒计时器,从10秒开始。 >2.玩家需要集中注意力并估计10秒钟过去的时间。 >3.当玩家认为10秒钟已经过去时,需要点击屏幕上的按钮。 >4.小程序会显示玩家的点击时间,以及与实际10秒钟的时间…

wetrtc简介

WebRTC(Web Real-Time Communication)是一种实时通信技术,它允许网络应用或站点在无需中间媒介的情况下,直接在浏览器之间建立点对点(Peer-to-Peer)的连接,实现音频、视频流或其他任意数据的实时…

泰勒创造力达到顶峰?(上)

hello,大家好!今天看一篇经济学人的一篇评论,说的是泰勒斯威夫特当前的创造力。经济学人总是语不惊人死不休,看看它对这位音乐天才做了怎样的评价。 事先声明哈,本文就是一种英语学习类讲述,没带任何个人色彩&#xff…

网络舆情分析:利用自然语言处理(NLP)洞察公众情绪

🌐 网络舆情分析:利用自然语言处理(NLP)洞察公众情绪 📊 概述 在数字化时代,公众情绪和舆论对企业品牌、政治决策乃至社会趋势都有着深远的影响。通过自然语言处理(NLP)技术&#…

北京金融大数据有限公司X百望云签署战略合作协议 共同发布“金数数据要素流通云平台”

随着数据资产与数据要素相关政策密集出台,资本与实业企业均跃跃欲试。但因为没有龙头企业的方案引领和成熟的落地实践,市场呈谨慎观望态势,热度无处安放。 北京金融大数据有限公司(以下简称“金融大数据公司”)作为市…

动手学深度学习——softmax分类

1. 分类问题 回归与分类的区别: 回归可以用于预测多少的问题, 比如"预测房屋被售出价格",它是个单值输出。softmax可以用来预测分类问题,例如"某个图片中是猫、鸡还是狗?",这是一个多…

深入理解正则表达式:从入门到精通

title: 深入理解正则表达式:从入门到精通 date: 2024/4/30 18:37:21 updated: 2024/4/30 18:37:21 tags: 正则Python文本分析日志挖掘数据清洗模式匹配工具推荐 第一章:正则表达式入门 介绍正则表达式的基本概念和语法 正则表达式是一种用于描述字符串…

Bert基础(二十一)--Bert实战:文本摘要

一、介绍 1.1 文本摘要简介 文本摘要(Text Summarization),作为自然语言处理(NLP)领域的一个分支,其核心目标是从长篇文档中提取关键信息,并生成简短的摘要,以提供对原始内容的高度…

Go语言map

map 概念 在Go语言中,map 是一种内建的数据结构,它提供了一种关联式的存储机制,允许你以键值对的形式存储数据。每个键都是唯一的,并且与一个值相关联。你可以通过键来查找、添加、更新和删除值,这类似于其他编程语言…

MAKEFILE 从易到难

相信一个简单的makefile, 只要用过C语言的都能写出来。 但是如果工程中包含了几十个文件夹, 上万个文件, 那用一般的方式就搞不定了。 在用dpdk 的时候, 会经常修改makefile要适配我们的工程。 最开始也是用dpdk中自带的makefil…

wpf 树形结构

Simplifying the WPF TreeView by Using the ViewModel Pattern - CodeProject 【原创】WPF TreeView带连接线样式的优化(WinFrom风格) - iDream2016 - 博客园 (cnblogs.com)

Android 音视频播放器 Demo(二)—— 音频解码与音视频同步

音视频编解码系列目录: Android 音视频基础知识 Android 音视频播放器 Demo(一)—— 视频解码与渲染 Android 音视频播放器 Demo(二)—— 音频解码与音视频同步 RTMP 直播推流 Demo(一)—— 项目…

selenium截屏代码

六、截屏应用场景:失败截图,让错误看的更直观方法: driver.get_screenshot_as_file(imgepath)参数:imagepath:为图片要保存的目录地址及文件名称如: 当前目录 ./test.png上一级目录 ../test.png扩展&#x…

Qt+Ubuntu20.04:打包qt

打包程序 参考 qt项目在Linux平台上面发布成可执行程序.run_qt.run不是虚拟机的配置文件-CSDN博客 Linux下Qt程序的打包发布(1)-不使用第三方工具 - 知乎 (zhihu.com) 过程 1、Release编译 先将你的程序在release下编译通过,保证下面打包的程序是你最新的。 2…

C#调用skiasharp操作并绘制图片

之前学习ViewFaceCore时采用Panel控件和GDI将图片及识别出的人脸方框和关键点绘制出来,本文将其修改为基于SKControl和SKCanvas实现相同的显示效果并支持保存为本地图片。   新建Winform项目,在Nuget包管理器中搜索并安装一下SkiaSharp和ViewFaceCore…