返回
JVM-Sandbox 源码笔记之模块加载
后端
2023-12-16 10:40:09
JVM-Sandbox 源码笔记之模块加载
一、前言
在启动篇中,我们讲了 Sandbox 的启动流程,其中提到了初始化模块。今天,我们将具体介绍 Sandbox 是如何加载模块的。
二、模块加载概述
模块加载是 Java 9 中引入的一项新特性,它允许我们将代码组织成独立的模块,并以声明的方式管理模块之间的依赖关系。模块加载的过程大致可以分为以下几个步骤:
- 查找模块:首先,需要找到要加载的模块。模块可以位于本地文件系统、网络或其他地方。
- 解析模块符:找到模块后,需要解析其模块符。模块描述符是一个 XML 文件,它包含了模块的名称、版本、依赖关系等信息。
- 加载模块:解析完模块描述符后,就可以加载模块了。模块的加载是由类加载器完成的。
- 链接模块:模块加载完成后,需要将其链接到其他模块。链接的过程会检查模块之间的依赖关系,并确保模块之间能够正常协作。
三、Sandbox 中的模块加载
Sandbox 通过 URLClassLoader 加载模块。URLClassLoader 可以加载位于指定 URL 路径下的模块。Sandbox 将模块的 JAR 包放在一个特定的目录下,并使用 URLClassLoader 加载这些 JAR 包。
在 Sandbox 中,模块加载的过程可以分为以下几个步骤:
- 初始化模块加载器:Sandbox 会创建一个自定义的模块加载器,该加载器继承自 URLClassLoader。
- 添加模块路径:将模块的 JAR 包所在目录添加到模块加载器的模块路径中。
- 加载模块:使用模块加载器加载模块。
- 链接模块:Sandbox 会将加载的模块链接到其他模块。
四、模块导出与引用
模块之间可以通过导出和引用来建立依赖关系。导出的模块可以被其他模块引用。模块的导出和引用可以通过模块描述符中的 requires 和 exports 元素来声明。
在 Sandbox 中,模块的导出和引用可以通过以下方式实现:
- 模块导出:Sandbox 会将模块的导出信息解析出来,并将其存储在模块加载器的导出信息表中。
- 模块引用:Sandbox 会将模块的引用信息解析出来,并将其存储在模块加载器的引用信息表中。
- 检查模块依赖关系:Sandbox 会检查模块加载器的导出信息表和引用信息表,以确保模块之间的依赖关系能够得到满足。
五、总结
本文介绍了 Sandbox 如何加载模块。Sandbox 通过 URLClassLoader 加载模块,并使用模块描述符来解析模块的依赖关系。本文还介绍了模块导出与引用的概念,以及如何在 Sandbox 中实现模块的导出与引用。