JAVA-平台模块系统原理

菜鸟为了巩固所写

目录

菜鸟为了巩固所写

代码之间的依赖性

绘制类型依赖图

扩展到包之间的依赖关系 

进一步延伸到jar包之间的依赖性

组件依赖图

JAVA技术领域中的两个著名的“擦除”

Java类型的“大泥球”

JAVA模块解析

模块解析的过程

模块路径明确模块的搜索与加载位置 

模块路径与类路径

模块的分类

解析过程中的模块

关于模块需要知道的


代码之间的依赖性

        类A 需要用到类 B 所实现的功能时,我们就说“类 A ”依赖于“类 B ”,可以绘制示意图表
明这种依赖关系。

        JPMS,关注的是模块之间的依赖性。

绘制类型依赖图

        通过阅读Future接口的声明,可以绘制出右侧的类型依赖图。

扩展到包之间的依赖关系 

        当PackageA中的某个或某些类,需要用到位于PackageB中的某个或某些类时,我们说“PackageA”依赖于“PackageB”。

进一步延伸到jar包之间的依赖性

        一个JAR包中可以包容多个package,如果a.jar这个文件中的某个或某些package依赖于b.jar这个文件中的某个或某些package,我们就说“a.jar这个“工件(artifact)”依赖于b.jar这个工件”。

        Artifact通常指软件开发过程中那些有着特定功能的,相对独立的,用于开发和构建软件系统的部件。JAR包就是一种典型的Artifact,我们使用它来搭建Java软件系统。

组件依赖图

        一个软件系统,通常包容多个组件,这些组件之间通常有着依赖关系。为此,我们通常会用一张图展示出这些组件之间的依赖关系,并将这些图称为“组件依赖图”。在
        Java 平台,最常见的组件就是jar 包,给普通的 jar 包配上一个module-info.class ,就变成了
“模块 module )”,这图就变成了“模块依赖图”。

JAVA技术领域中的两个著名的“擦除”

  • 类型擦除(Javac处理泛型代码) :编译时,java代码中的泛型参数信息被抹掉,生成的.class 文件中并没有泛型参数的影子。
  • 组件边界擦除(JAV处理JAR包):运行时,JVM 的类加载器会“打开”类路径中找到的JAR 包 ,抽取出它里面定义的类型,构建出一个“类图”,这里面,并没有保留类的“来源地(即来自于哪个JAR包 )”信息。

Java类型的“大泥球”

        早期的JDK中,由于存在着JAR包边界“擦除” 现象,所以,虽然事实上JAR包之间有着依赖关系,但当程序运行之后JVM无法建立与维护JAR包之间的这种依赖关系,最终把所有JAR包中的类型在一起,变成一个“大泥球( big ball of mud)”。

 

        JPMS通过给原始的JAR包附加上一个 “模块描述符 ”,将原始的JAR包转换为了“模块(Module)”,解决了上述问题。

JAVA模块解析

        在编译和运行时,模块化的java 应用程序,会得到一张“模块依赖图”。

        图中的节点表示模块,而边缘表示模块之间的 依赖关系,箭头表示可读性。 

        Java模块系统不允许模块之间存在编译时循环依赖。

        Java构建和生成这种模块依赖图的过程,称为“ 模块解析 ”。

模块解析的过程

        模块解析是根据给定的模块依赖关系图并从该图中选择一个根模块(root module )来计算最低需求的模块集的过程,根模块(或者称为初始模块),可由javac或java的module参数指定。

  1. 首先从一个根模块开始,并将其添加到解析集中。
  2. 向解析集添加所需的模块(依据module-info. java中定义的requires语句)。
  3. 重复第2步,将新的模块添加到解析集中。

        依据解析集中的模块以及它们之间的依赖关系,可以绘制出一个可视化的“模块依赖图”。这张图非常有用,可以帮助我们快速地定位可能出现的各种问题,并且迅速地把握整个程序的架构。

模块路径明确模块的搜索与加载位置 

  • 模块保存的文件夹(集合),称为“模块路径( module path)”。
  • 当使用javac编译Java模块化应用,或者使用java运行Java模块化应用,都可以通过--module-path参数指定这个“模块路径” 。

        “模块路径”其实是一个文件夹的集合,不同的文件夹之间使用分号间隔(适用于Windows,Linux下是 “:”)。当编译或启动Java模块化应用时,javac编译器或JVM会到模块路径中所包容的文件夹那儿去搜索和加载模块,并解析它们之间的依赖关系,构建出一张“模块依赖图”。

模块路径与类路径

  • 放在模块路径中的JAR包,被看成模块化的JAR解析时JVM会主动地去搜索module-info.class文件。
  • 放在类路径中的JAR包则被看成是普通的JAR,其中的类型被直接加载到类型命名空间中。

        注意两种场景,JVM在启动Java应用程序时,会给出不同的处理方式: 

  1. 将普通JAR放在模块路径上,这种模块称为“自动模块”。
  2. 将模块化JAR放在类路径上,这种模块称为“无名模块”。

模块的分类

  • 属于JDK的模块,称为“平台模块”。
  • 第三方(库、框架或具体应用)开发者自己开发的模块称为“应用模块”。

        在大多数开发场景下,“平台模块”是“透明的”,不管你开发的是不是模块化应用,只要使用的是 JDK9以上版本JDK都是模块化的,但开发者感受不到它与以前的JDK有什么不一样的地方,因为模块化的JDK经过了仔细的设计,拥有良好的兼容性。

解析过程中的模块

  • 初始模块:最先开始编译(使用javac命令)的应用程序模块或者包含main函数(使用java命令)的应用程序模块。
  • 根模块:JPMS从此处开始解析依赖。除了包含主类或要编译的代码,初始模块同时也是一个根模块 。根模块可以在命令行中使用m参数指定,也能使用-add-modules参数动态地添加。
  • 可见模块:当前运行时的所有平台模块以及通过命令行指定的所有应用程序模块都叫作“可见模块”,它们共同构成可见模块全集。

可见模块全集由平台模块JDK中的模块)和应用程序模块(模块路径上的模块)组成。在解析期间,从该集合中选取模块生成此应用程序的模块依赖图(模块路径上可以有很多个模块化JAR包,应用程序并不一定会用到所有的 JAR 包)。

关于模块需要知道的

  • 模块依赖性的检查,会在编译时和运行时都进行,在编译时如果有依赖的模块丢失时,编译将失败 ,同样地,在运行时相应的模块jar包丢失时,也会失败JPMS抛出ClassNotFound异常。
  • 模块没有版本的概念,而是由它的名字唯一标识。
  • 模块之间不能有循环依赖,当出现这种情况时,编译和运行将失败。
  • 不同的模块,不要导出相同名字的包,出现这种情况时,编译和运行都会失败。

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

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

相关文章

Keil5配色方案修改为类似VSCode配色

1. 为什么修改Keil5配色方案 视觉习惯:如果你已经习惯了VSCode的配色方案,尤其是在使用ESP-IDF开发ESP32时,Keil5的默认配色可能会让你感到不习惯。减少视觉疲劳:Keil5的默认背景可能过于明亮,长时间使用可能会导致视…

微服务监控prometheus+Grafana

目录 Prometheus 概述 核心组件 特点 使用场景 Grafana 概述 功能特点 使用场景 PrometheusGrafana组合 部署和配置 一、准备工作 二、部署Prometheus 三、部署Grafana 四、创建监控仪表盘 五、验证和调优 总结 微服务监控是确保微服务架构稳定运行的关键环节…

⭐Java---反射--获取类信息⭐

目录 三种获取类信息的方式: 一个输入类名字获取类信息的类: 一个测试类: 测试结果 三种获取类信息的方式: 对象.getClass()类.classClass.forname("类的路径") People p; Class c1p.getClass();//将对象&#xff…

等差数列末项计算

等差数列末项计算 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 给出一个等差数列的前两项a1,a2,求第n项是多少。 输入 一行,包含三个整数a1,a2&#x…

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

全文摘要 本文介绍了一种名为PETRv2的统一框架,用于从多视图图像中进行三维感知。该框架基于先前提出的PETR框架,并探索了时间建模的有效性,利用前一帧的时间信息来提高三维物体检测效果。作者在PETR的基础上扩展了三维位置嵌入(…

【最新免费PPT制作并下载】Kimi PPT助手:智能化演示文稿生成,职场效率的革命性提升

最新免费PPT制作方法在这里!下面我想向大家介绍一款能够极大提升我们工作效率的工具——Kimi PPT助手。 Kimi PPT助手:智能化演示文稿生成 Kimi PPT助手是由Moonshot AI推出的一款革命性产品,它通过人工智能技术,实现了PPT的一键…

蓝桥杯准备训练(lesson2 ,c++)

3.1 字符型 char //character的缩写在键盘上可以敲出各种字符,如: a , q , , # 等,这些符号都被称为字符,字符是⽤单引号括 起来的,如: ‘a’ , ‘b’ &…

C# 动态类型 Dynamic

文章目录 前言1. 什么是 Dynamic?2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…

前端开发 之 15个页面加载特效中【附完整源码】

前端开发 之 15个页面加载特效中【附完整源码】 文章目录 前端开发 之 15个页面加载特效中【附完整源码】八:圆环百分比加载特效1.效果展示2.HTML完整代码 九:毒药罐加载特效1.效果展示2.HTML完整代码 十:无限圆环加载特效1.效果展示2.HTML完…

C语言练习作业1204

编写程序实现:strlen;strcpy;strcat;strcmp 的功能。 一、strlen()函数 1.1 分析 size_t strlen(const char *s);【功能】:计算字符串的长度,\0之前的字符串数量;【参数】:s&#…

查询品牌涉及两张表(brand、brand_admin_mapping)

文章目录 1、BrandController2、AdminCommonService3、BrandApiService3、BrandCommonService4、BrandSqlService涉及的表SQL 查询逻辑参数处理执行查询完整 SQL 逻辑参数映射总结 查询指定管理员下的品牌所涉及的表有哪些? http://127.0.0.1:8087/brand/admin/list…

[go-redis]客户端的创建与配置说明

创建redis client 使用go-redis库进行创建redis客户端比较简单,只需要调用redis.NewClient接口创建一个客户端 redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "",DB: 0, })NewClient接口只接收一个参数red…

Linux CentOS

​阿里云开源镜像下载链接 https://mirrors.aliyun.com/centos/7/isos/x86_64/ VMware 安装 CentOS7 自定义 下一步 选择稍后安装操作系统 选择 输入 查看物理机CPU内核数量 CtrlShiftEsc 总数不超过物理机内核数量 推荐内存 自选 推荐 推荐 默认 拆分成多个 默认 自定义硬件…

【STM32 Modbus编程】-作为主设备读取线圈和输入

作为主设备读取线圈和输入 文章目录 作为主设备读取线圈和输入1、硬件准备与连接1.1 RS452模块介绍1.2 硬件配置与接线1.3 软件准备2、读取线圈2.1 主设备发送请求2.2 从设备响应请求2.3 主机接收数据3、读取输入4、结果本文将在前面文章的基础上,实现主设备通过ModBus协议对从…

2-2-18-13 QNX系统架构之原生网络(Qnet)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…

多模态COGMEN详解

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

基于频谱处理的音频分离方法

基于频谱处理的音频分离方法 在音频处理领域,音频分离是一个重要的任务,尤其是在语音识别、音乐制作和通信等应用中。音频分离的目标是从混合信号中提取出单独的音频源。通过频谱处理进行音频分离是一种有效的方法,本文将介绍其基本原理、公…

HTML旋转爱心

系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)1…

查看 tomcat信息 jconsole.exe

Where is the jconsole.exe? location: JDK/bin/jconsole.exe

设计模式10:观察者模式(订阅-发布)

系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考:简说设计模式——工厂方法模式 - JAdam - 博客园 参考:简单工厂模式(Simple Factory Pattern) - 回忆酿的甜 - 博客园 一:概述 观察者模式&#xff0…