Java中的自动模块
该模块是为重用而设计的包的集合,Module JAR 是一个常规 JAR,其根文件夹中有一个模块描述符。自动模块是来自已放入模块路径的类路径的 JAR。默认情况下,它们的名称源自 jar 文件名。
因此,您可以在应用程序中使用大量预先存在的库。其中许多尚未模块化,但为了便于迁移,您可以将任何库的 JAR 文件添加到应用程序的模块路径中,然后使用该 JAR 中的包。当您这样做时,JAR 文件隐式成为一个自动模块,并指定模块声明需要一个指令。
它导出所有包,因此任何可以读取自动模块的模块都可以访问自动模块包中的所有公共类型。读取或需要所有其他模块,因此自动模块可以访问系统其他模块公开的所有公共类型
自动模块的命名
- 如果名称遵循正则表达式“-(\\d+(\\.|$))”,则模块名称将从第一次出现的连字符之前的子序列中派生。
- “.jar”后缀或扩展名被删除。
- 模块名称中的所有非字母数字字符[^A-Za-z0-9] 都替换为点“.” ,
- 所有重复的点都只替换为一个点“.”,并且所有前导点和尾随点都被删除。
自动模块中的资源
当自动模块需要资源时,例如音频、图像、视频等,这些资源应该与模块一起打包,以确保在执行时使用模块的类型时它们可用。
按照惯例,资源通常与模块信息一起放置在模块根目录下名为 res 的文件夹中。 Java文件,这称为资源封装(如下所示)。
自动模块的用途:
- 如果工件在其主要清单条目中具有属性 Automatic-Module-Name,则自动模块允许您处理工件。
- 与所有包一样,传统的封装级别既对深度反射访问开放,又为对其公共类型的普通编译时和运行时访问而导出。
- 我们可以读取所有其他命名模块,无论是自动的还是显式的。
- 我们可以使用它更快地发现错误,因为使用类路径可以做到这一点。
- 自动模块使我们的应用程序轻量级并提高了应用程序的性能。这样,它可以在更多设备上运行。
- 它帮助我们开发模块化应用程序或模块化我们现有的应用程序,而无需等待第三方库模块化。
例子:
simple-add/src/simple/add/calculate.java
Java
// Java program to define the sum()
// method inside the calculate class
package simple.add
public class calculate {
public static int sum(int a1, int a2)
{
return a1 + a2;
}
}
Java
// Java program to import and use the
// methods of the calculate class
package com.example
import simple.add.calculate;
public class main {
public static void main(String[] args)
{
int sum = calculate.sum(10, 7);
System.out.println("sum is " + sum);
}
}
上面的例子有一个名为Calculate的类,它有一个函数(sum) 来返回两位数的加法。
add.app/src/com/example/main.java
Java
// Java program to import and use the
// methods of the calculate class
package com.example
import simple.add.calculate;
public class main {
public static void main(String[] args)
{
int sum = calculate.sum(10, 7);
System.out.println("sum is " + sum);
}
}
上面的代码有一个主类,并通过导入它们来使用Calculate类的函数sum。
add.app/src/module-info.java
module add.app {
requires simple.add;
}
上面的模块声明需要依赖 jar 模块(自动)的名称,它将从“easy-math.jar”转换为“easy.math”
输出:下面是使用自动模块对上述代码的期望输出
E:\automatic-module-example\add.app>java --module-path out;lib --module add.app/com.example.main
sum : 17
为什么选择自动模块?
引入 Automatic 模块是为了使编译和启动应用程序更加顺畅和可靠,并比使用类路径更快地发现错误或错误。为了使它们顺利进行,除了命名模块之外,模块声明无法要求任何其他内容,它排除了从类路径加载的所有内容。如果故事到此结束,一个模块 JAR 只依赖于其他模块 JAR,它会穿透环境自下而上进行模块化。