Java模块化系统:引领代码革命与性能飞跃

JDK工程结构的问题

在说Java模块化系统之前,先来说说Java9之前的JDK在工程结构上的问题,从JDK本身的问题说起,Java从1996年发布第一版到2017年发布Java9,中间经历了近20年的时间,在这期间发布了无数个大大小小的版本用来支撑新的特性。

在Java新特性越来越丰富的同时,也带来了相应的问题。JDK8是一个广泛使用的版本,我们就以JDK8为例,先来看看目录结构
 

在这里插入图片描述


在JDK8以及之前的版本,我们安装的时候会安装两部分内容

  • JDK(Java Development Kit)主要用于开发者提供了开发工具和环境
  • JRE(Java Runtime Environment)主要提供Java运行时环境

JDK是开发Java应用的完整套装,而JRE则是为了支持已编译的Java程序在任何计算机上运行而设计的环境。JDK内部包含了JRE,以方便开发者在开发的同时也能直接运行和测试他们的代码

在jre/bin目录下有一个rt.jar文件,表示的是runtime,即运行时。JVM会加载这整个文件来支持Java运行时环境,而rt.jar文件的大小已经达到50-60M,也就是说在运行你的Java程序之前,就需要花这么多内存来加载Java运行时环境,我们来看看rt.jar中包含哪些内容
 

在这里插入图片描述


我们使用解压工具打开rt.jar可以清晰的看到,里面包括的内容很全,基本上包括了Java的方方面面,都给你加载进去了。就算你只写一个HelloWord,它也给你加载了Applet、awt等你根本不会用到的东西。现在的服务器和个人电脑随便都是8G、16G以上的内存,对于rt.jar占用的这点内存可能没什么感觉,但在一些对于内存很敏感的领域,Java这种方式就显得不太合理。Java官方可能也意识到了这个问题,所以在Java9的时候推出了Java平台模块系统(Java Platform Module System,JPMS)

Java平台模块系统(Java Platform Module System,JPMS)

JPMS是在Java9发布的,其实从Java7开始官方就在准备JPMS,本来准备在Java8中引入JPMS的,实在是改动太大,到Java9中才正式发布。其实做过开发的都会想的到,模块化相当于要从整体上重构整个系统,结构调整巨大,对于整个系统考验是很大的,这可能也是JPMS从Java7开始准备,直到Java9才发布的原因。

前面我们说过,在Java8及之前的版本中,其实是包括JDK和JRE两个部分的。但从Java9之后,就没有专门的JRE了,因为模块化之后,自己可以选择JVM加载哪些模块,相当于按需加载就行了,你写HelloWord可能只需要一个加载java.base就行了。
下面是JDK11的结构
 

在这里插入图片描述


在JDK安装目录下有一个jmods目录,在该目录下就定义了JDK中各个模块,以.jmod结尾的文件就是JDK中定义的各个模块,我们打开java.base.jmod文件看一下
 

在这里插入图片描述


可以看到在java.baseclass/java/目录中,包括了一些Java基础用到的lang、math、nio等基础包,没有包插applet、awt等不常用的包。
这样按模块化划分之后,一方面可以更好的管理JDK的各个模块,另外一方面对于使用者来说,也不用像旧版JDK那样一股脑把所有的内容加载到JVM中,这样更加合理,也更节省资源。

Java模块化系统以克服当前所存在的局限时,主要设定了两个目标

  • 对JDK本身进行模块化
  • 提供一个应用程序可以使用的模块系统

上面我们已经看到了JDK本身模块化的改造,下面我们就来看看应用程序是如何使用模块系统的

应用程序模块化实现

应用程序实现模块化只需要简单的三步就可以完成

  • 定义模块
  • 导出模块
  • 引用模块

先整体看一下,我们定义了三个模块userModule、OrderModule、GoodsModule,项目的结构如下:

在这里插入图片描述

module-info.java文件

module-info.java文件是用来定义模块的,在模块的src目录下定义一个module-info.java文件,内容如下

module UserModule {
    
}

简单的定义了一个UserModule的模块,里面内容是空的
现在三个模块是独立的,假如在OrderModule中需要使用UserModuler的UserService,直接使用肯定是引用不到的,需要进行exports

exports

如果需要将模块中的内容对外,需要在module-info.java中把相应的包exports出去

module UserModule {
    exports com.user;
}

如上所示,表示UserModule将com.user包对外提供服务

requires

如果需要引用其他模块的内容,需要先使用requires将模块引用进当前模块,如下

module OrderModule {
    requires UserModule;
}

如上所示,表示OrderModule引用了UserModule,如此在OrderModule中就可以使用UserModule中exports出来的包

    public static void main(String[] args) {
        UserService userService = new UserService();
        userService.register();
    }

如上所示,在OrderModule中就可以直接引入UserService了

如果你只想将UserModule开放给GoodsModule,可以这样写

module UserModule {
    exports com.user to GoodsModule;
}

这样就算OrderModule引用了UserModel,也没办法使用UserService,因为UserModule只开放给GoodsModule了

以上就是一个使用模块化来实现模块之间相关调用的简单例子,当然实际的模块化系统不可能这么简单,此处只起到一个抛转引玉的作用,如果对模块化系统比较感兴趣可以去JDK官网了解详细的信息

模块化的好处

1、强封装性

类和包可以被模块化,只有模块之间声明的接口是对外可见的,提高了代码的封装性,减少了不必要的耦合

2、明确的依赖管理

块之间通过requires声明依赖,明确指出了哪些模块需要哪些其他模块,避免了隐式依赖和类路径冲突

3、运行时性

JVM可以仅加载运行应用程序所需的模块,减少了内存占用,提高了启动速度和运行时性能

4、安全性和隔离

模块边界强化了安全性,限制了代码的访问权限,降低了攻击面

通过模块化,Java开发者可以构建更加健壮、高效且易于维护的大型应用程序

前端的世界总是在不断变化,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。Web Components 就是这样一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RESTFul风格设计和实战

四、RESTFul风格设计和实战 4.1 RESTFul风格概述 4.1.1 RESTFul风格简介 RESTful(Representational State Transfer)是一种软件架构风格,用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量级的通信协议&#x…

YAML如何操作Kubernetes核心对象

Pod Kubernetes 最核心对象Pod Pod 是对容器的“打包”,里面的容器(多个容器)是一个整体,总是能够一起调度、一起运行,绝不会出现分离的情况,而且 Pod 属于 Kubernetes,可以在不触碰下层容器的…

存储或读取时转换JSON数据

一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题: 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …

Feign 和 OpenFeign 的区别

Feign 和 OpenFeign 都是用来进行服务间调用的客户端库,它们旨在简化HTTP API客户端的编写过程,使得编写对外部服务的接口就像调用本地方法一样简单。尽管它们有相似之处,但也存在一些关键差异: 归属和演进: Feign 最初…

硬件设计计划与APQP

硬件设计的关键节点: 大的里程碑milestone分为: Kickoff->A Samples->做出第一批B样总成件->B Samples/OTS->C Samples->PPAP->SOP 具体到硬件,A/B/C sample阶段,又可细分为: 关键器件选型&硬件系统方案设计原理图绘制PCB LayoutA_BOM输出PCB制板…

3. 深度学习笔记--优化函数

深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、Adagrad、Adadelta、RMSprop、Adam、Nadam、AdaMax、AdamW ) 0. GD (梯度下降) Gradient Descent(梯度下降)是一种迭代优化算法&#xf…

FreeRTOS内存管理(1-20)

FreeRTOS内存管理简介 在使用FreeRTOS创建任务,队列,信号量等对象时,一般都提供两种方法 1:动态创建任务(方法)自动地从FreeRTOS管理的内存堆中申请创建对象所需要的内存,并且在删除对象后可以…

九州金榜|孩子沉迷于网络:家庭教育的挑战与对策

随着时代的进步,科技的发展,网络现在成为了我们日常生活不可分割的一部分。然而,随着网络的普及也出现了一些列的问题,其中孩子沉迷于网络就是当前家长最为关心的问题,对于这种情况的发生,家庭教育就显得尤…

Linux主机重启后报错:[FAILED] Failed to start Switch Root.

一、问题描述 某次云主机因计费问题,导致批量重启,重启后发现某台云主机竟进入紧急救援模式(emergency模式),如下所示: 二、原因及处理 1)原因:加载根分区失败,导致无…

Libcity笔记:原子文件

1 介绍 Libcity中的数据以原子文件的形式存在 2 原子文件类别 对于不同的交通预测任务,可能用到不同的原子文件,同一个数据集不一定包含全部六种原子文件 网格数据需要按照先行后列的顺序遍历OD数据需要按照先起点后终点的顺序遍历 2.1 geo 存储地理…

Netty 实现dubbo rpc

一、RPC 的基本介绍 RPC (Remote Procedure Call) 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外的为这个交互编程。也就是说可以达到两个或者多个应用程序部署在不同的服务器上&…

OpenCV 入门(七)—— 身份证识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

德国韦纳WENAROLL滚压刀,液压缸,滚光刀,挤压刀,滚轧刀

德国韦纳WENAROLL滚压刀,液压缸,滚光刀,挤压刀,滚轧刀(百度一下,西安尚融) 德国韦纳(WENAROLL)的滚压刀、液压缸、滚光刀、挤压刀和滚轧刀在工业领域享有很高的声誉,这些产品因其高…

SM618卡件SM480模块和利时

SM618卡件❗电:183-6998-1851❗SM480模块和利时。自动化程度的提高,I/O点数大幅增 加,传统单一配线的方式已经无法满足发展的需 要SM618卡件SM480模块和利时。.对简单、可靠的配线方式的需求日益强烈. 传统接线 - 以并联方式连 接…

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时,避免窗体闪烁的方法: 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先,右键项目,添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…

访问学者在外访学期间,是否可以中途回国?

在全球化的今天,访问学者制度已成为促进国际学术交流与合作的重要桥梁。然而,对于许多国外访问学者来说,一个常见的问题是:在访学期间,我是否可以中途回国?这个问题涉及到多个方面,包括政策法规…

7步教程从零开始搭建跨境电商平台开发

跨境电商平台开发一直是创业者们追逐的热门领域之一。本文将为您提供一个7步教程,帮助您从零开始搭建跨境电商平台,让您在这个充满机遇的领域中抢占先机。 步骤一:市场调研和定位 在开始搭建跨境电商平台之前,第一步是进行充分的…

大数据与会计专业主要学什么课程

大数据与会计专业是一个结合了传统会计知识与现代大数据技术的交叉学科,旨在培养既懂会计又熟悉大数据分析的复合型人才。该专业的学生将会学习以下主要课程内容: 会计基础课程:包括基础会计、财务会计、成本会计、管理会计等,这些…

我独自升级崛起下载教程 我独自升级崛起怎么一键下载

定于5月8日全球盛大发布的动作RPG力作《我独自升级崛起》,基于备受追捧的同名动画及网络漫画,誓为热情洋溢的游戏爱好者们呈献一场深度与广度兼具的冒险盛宴。这款游戏巧妙融合网络武侠元素,其创意十足的设计框架下,核心叙述聚焦于…

OSPF综合实验(超详细易懂)(HCIP)

1、拓扑信息 2、需求分析 3、IP规划 4、配置 5、测试 1、拓扑信息 2、需求分析 R4为ISP,其上只能配置I地址; R4与其他所有直连设备间均使用公有IP 公网中使用的是点到…
最新文章