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.xdnf.cn/news/33909.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DevExtreme JS ASP.NET Core v24.2新功能预览 - 全新的聊天组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

总结与反思-50天小总结

作者:麻瓜也要学魔法 时间:2024/12/4 不知不觉中咱博客的码龄居然50天了!内容主要就是运维方面的知识,主打一个学到哪发到哪。 看了看,50天欸!刚好就50篇文章,不得不说(咱还是真稳定…

centos8 mysql 主从复制

原理 一、一主一从 准备工作 1.主库配置 1、修改配置文件 /etc/my.cnf #mysql 服务ID,保证整个集群环境中唯一,取值范围:1-232-1,默认为 server-id1 #是否只读,1 代表只读,0代表读写 read-only0 #忽略的数据,指不需要同步的数据库 #binlog…

iptables防火墙SNAT与DNAT

第二章 iptables防火墙SNAT与DNAT 文章目录 第二章 iptables防火墙SNAT与DNAT1 SNAT1.1 SNAT原理与应用1.2 SNAT工作原理1.3 SNAT转换前提条件2 SNAT示例2.1 网关[服务器配置](https://so.csdn.net/so/search?q服务器配置&spm1001.2101.3001.7020)2.1.1 网关服务器配置网卡…

【推荐100个unity插件之36】Unity6使用DOTS基础篇——Entities(非常适合做一些弹幕射击游戏)

文章目录 前言DOTS 核心组成DOTS 解决传统问题的痛点1、优化内存布局:2、减少垃圾回收和内存管理开销:3、提高并行计算能力:4、高效的系统和组件设计:5、易于扩展和优化: 安装文档在编辑器下构建 ECS World查看Entity的…

AI一键生成原创圣诞印花图案

一、引言 随着科技的飞速发展,AI 已经深入到我们生活和工作的各个角落,为创意设计领域带来了前所未有的变革。在圣诞即将来临之际,想要设计独特的圣诞印花图案却又担心缺乏灵感或专业技能?别担心,千鹿 AI 为我们提供了…

第一部分 —— 密文类型

文章目录 1. Abstract1.1 Some Conceptions 2. TFHE Ciphertexts3. GLWE3.1 Trivial GLWE ciphertexts3.2 LWE 和 RLWE3.3 Public key encryption 4. GLev4.1 Lev and RLev 5. GGSW5.1 GSW and RGSW 1. Abstract TFHE 指的是 全同态加密策略。意思是,允许对密文进行…

进制转换详解

进制转换的基本概念 进制转换是将一个数从一种基数(进制)转换为另一种基数的过程。例如,将十进制数转换为二进制、八进制或十六进制。 转换过程 以十进制数转换为其他进制为例,转换的基本步骤如下: • 除以目标进制…

构建数字影像生态群,致力推动数字经济发展

在当今数字化浪潮汹涌澎湃的时代,数字经济逐渐成为全球经济增长新的核心驱动力。国际数字影像产业园作为数字影像领域的创新高地,正以其独特的优势和不懈的努力,为推动数字经济的蓬勃发展贡献着卓越力量。 国际数字影像产业园凭借其优越的地理…

性能测试工具1:perf

1.介绍 perf是linxu下的一款性能分析工具。Linux的性能计数器是一个新的基于内核的子系统,它为所有性能分析提供了一个框架。它包括硬件级别(CPU/PMU、性能监控单元)功能和软件(软件计数器、跟踪点)功能。 通过perf,应用程序可以利用PMU…

学籍照片电子版手机拍照采集且批量自动命名的方法

学籍照片作为学生档案的重要组成部分,其电子版的采集和管理显得尤为重要,目前主要通过“全国学籍信息管理系统”进行管理。传统的拍照和命名方式不仅耗时耗力,而且容易出现错误。为了提高效率和准确性,下面介绍如何由教师自己使用…

在wsl2中安装archlinux

在之前的博客中,我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置,但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利,在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…

蓝桥杯真题1259奇怪的捐赠(python版)

解题思路:将100万转换为7进制数,数位之和就是分成的份数 num 100_0000 sum 0 while num > 0:remainder num % 7num num // 7sum remainder print(sum)代码来自题目题解 num对7进行取余,取值范围理应是[0,1,2,3,4,5,6] 但是对于题目给定的捐赠金额实际上并不…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

python学习笔记15 python中的类

上一篇我们介绍了python中的库 ,学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库,常见的内置库(random、hashlib、json、时间、os) 这一篇我们来看一下python中的类 创建一个类 class 类的名称():de…

Redis面试专题-持久化

前言 开始Redis面试知识的复习和资料的收集(收集和参考了网上的优质文章),本篇文章会不断更新,本系列文章主要分为两部分,一部分是该专题所涉及的相关基础知识,另一部分是面试题与思考题,大部分…

Altium Designer基础知识2:交互式差分布线

Altium Designer基础知识2:交互式差分布线 一、本文内容与前置知识点1. 本文内容2. 所用软件 二、差分式布线介绍1. 介绍2. 使用场景 三、布线流程1. 创建差分式布线对2. 布线 一、本文内容与前置知识点 1. 本文内容 Altium Designer的基础知识,差分布…

注意力机制的输入

注意力机制的输入 flyfish 注意力机制用于确定序列中每个组成部分相对于其他部分的相对重要性。 绘图源码 import matplotlib.pyplot as plt from matplotlib.patches import FancyArrowPatchplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

Anaconda创建虚拟环境+CUDA、cuDNN一同安装

文章目录 前言一、CUDA的作用二、下载CUDA的步骤2.1 查看电脑NVIDIA适合的CUDA版本( 两种方法)1)打开NVIDIA控制面板,目前我的CUDA版本是12.12)使用命令行查看,使用命令:nvidia-smi。 2.2 根据p…

数学建模之熵权法

熵权法 概述 **熵权法(Entropy Weight Method,EWM)**是一种客观赋权的方法,原理:指标的变异程度越小,所包含的信息量也越小,其对应的权值应该越低(例如,如果对于所有样本而言,某项指标的值都相…