返回

JVM-Sandbox 源码笔记之模块加载

后端

JVM-Sandbox 源码笔记之模块加载

一、前言

在启动篇中,我们讲了 Sandbox 的启动流程,其中提到了初始化模块。今天,我们将具体介绍 Sandbox 是如何加载模块的。

二、模块加载概述

模块加载是 Java 9 中引入的一项新特性,它允许我们将代码组织成独立的模块,并以声明的方式管理模块之间的依赖关系。模块加载的过程大致可以分为以下几个步骤:

  1. 查找模块:首先,需要找到要加载的模块。模块可以位于本地文件系统、网络或其他地方。
  2. 解析模块符:找到模块后,需要解析其模块符。模块描述符是一个 XML 文件,它包含了模块的名称、版本、依赖关系等信息。
  3. 加载模块:解析完模块描述符后,就可以加载模块了。模块的加载是由类加载器完成的。
  4. 链接模块:模块加载完成后,需要将其链接到其他模块。链接的过程会检查模块之间的依赖关系,并确保模块之间能够正常协作。

三、Sandbox 中的模块加载

Sandbox 通过 URLClassLoader 加载模块。URLClassLoader 可以加载位于指定 URL 路径下的模块。Sandbox 将模块的 JAR 包放在一个特定的目录下,并使用 URLClassLoader 加载这些 JAR 包。

在 Sandbox 中,模块加载的过程可以分为以下几个步骤:

  1. 初始化模块加载器:Sandbox 会创建一个自定义的模块加载器,该加载器继承自 URLClassLoader。
  2. 添加模块路径:将模块的 JAR 包所在目录添加到模块加载器的模块路径中。
  3. 加载模块:使用模块加载器加载模块。
  4. 链接模块:Sandbox 会将加载的模块链接到其他模块。

四、模块导出与引用

模块之间可以通过导出和引用来建立依赖关系。导出的模块可以被其他模块引用。模块的导出和引用可以通过模块描述符中的 requires 和 exports 元素来声明。

在 Sandbox 中,模块的导出和引用可以通过以下方式实现:

  1. 模块导出:Sandbox 会将模块的导出信息解析出来,并将其存储在模块加载器的导出信息表中。
  2. 模块引用:Sandbox 会将模块的引用信息解析出来,并将其存储在模块加载器的引用信息表中。
  3. 检查模块依赖关系:Sandbox 会检查模块加载器的导出信息表和引用信息表,以确保模块之间的依赖关系能够得到满足。

五、总结

本文介绍了 Sandbox 如何加载模块。Sandbox 通过 URLClassLoader 加载模块,并使用模块描述符来解析模块的依赖关系。本文还介绍了模块导出与引用的概念,以及如何在 Sandbox 中实现模块的导出与引用。