Java9新特性中的模块化详解

Java9新特性中的模块化详解

什么是模块化程序设计

在Java9之前,所有的Java代码都需要打包到JAR文件中,然后导入其中的类来进行使用。这种方式可能会导致一些问题,比如命名冲突、类文件加载过多等问题,而模块化程序设计是为了解决这些问题而产生的。

Java9中,你可以将类文件和其相关依赖组织成为一个模块,模块可以指定哪些包对外暴露、哪些包只在内部使用等,可以更好的管理代码,避免一些问题的产生。

模块化程序设计的语法

模块定义

在Java9中,使用module-info.java文件定义一个模块,模块文件的语法与Java语法类似,如下:

module com.example.moduleName {
    requires module1;
    requires module2;
    exports package1;
}

这里的moduleName是模块的名称,requires关键字用于指定该模块依赖的其他模块,可以有多个requires关键字,exports关键字用于指定该模块对外暴露(导出)的包名,也可以有多个。

模块依赖

要使用其他模块中的类,需要在模块定义中使用requires指定依赖:

module com.example.moduleName {
    requires module1;
}

导出包

如果想从当前模块中暴露某个包,让其它模块可以访问到,则需要在模块定义中使用exports指定需要导出的包:

module com.example.moduleName {
    exports package1;
}

示例一:创建一个模块,并依赖另外一个模块

创建模块

首先,我们需要新建一个Java工程,然后在根目录下新建一个module-info.java文件,文件内容如下:

module com.example.moduleA {
    requires com.example.moduleB;
}

这里我们创建了一个名为com.example.moduleA的模块,并指定依赖com.example.moduleB模块。

创建依赖的模块

com.example.moduleA模块中我们依赖了com.example.moduleB模块,所以我们需要先创建这个模块。方法同上,在根目录下新建一个module-info.java文件,文件内容如下:

module com.example.moduleB {

}

编写代码

我们在com.example.moduleB中创建一个com.example.moduleB.HelloB类:

package com.example.moduleB;

public class HelloB {
    public void hello() {
        System.out.println("Hello from ModuleB");
    }
}

com.example.moduleA中创建一个com.example.moduleA.HelloA类:

package com.example.moduleA;
import com.example.moduleB.HelloB;

public class HelloA {
    public void hello() {
        System.out.println("Hello from ModuleA");
        new HelloB().hello();
    }
}

编译打包

我们需要先使用Java9以上的版本编译程序,然后将编译后的类文件打包成JAR文件。

运行程序

我们在根目录下新建一个Main.java文件,文件内容如下:

package com.example;

import com.example.moduleA.HelloA;

public class Main {
    public static void main(String[] args) {
        new HelloA().hello();
    }
}

使用Java9以上的版本运行程序:

java --module-path /path/to/your/jar/files -m com.example/com.example.Main

可以看到输出结果:

Hello from ModuleA
Hello from ModuleB

示例二:导出一个包

创建模块

我们使用上一个示例中的工程,不过需要对com.example.moduleA模块作如下修改:

module com.example.moduleA {
    requires com.example.moduleB;
    exports com.example.moduleA;
}

这里我们增加了一个exports关键字,对包com.example.moduleA进行导出。

编写代码

我们在com.example.moduleA模块中创建一个com.example.moduleA.HelloA类:

package com.example.moduleA;

public class HelloA {
    public void hello() {
        System.out.println("Hello from ModuleA");
    }
}

在根目录下新建一个Main.java文件,文件内容如下:

package com.example;

import com.example.moduleA.HelloA;

public class Main {
    public static void main(String[] args) {
        new HelloA().hello();
    }
}

编译打包

同上。

运行程序

同上。

运行结果:

Hello from ModuleA

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java9新特性中的模块化详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java实现单人信息管理程序

    下面我将为你详细讲解“Java实现单人信息管理程序”的完整攻略。 1. 需求分析 在开始编写程序之前,我们需要确定具体的需求。本文中,我们需要实现单人信息管理程序,需要实现以下功能:1. 添加一个新的信息2. 查看所有信息3. 修改已有的信息4. 删除已有的信息 2. 数据结构设计 在确定需求之后,我们需要确定数据结构。这里我们使用Java中的ArrayLi…

    Java 2023年5月18日
    00
  • java基于servlet实现文件上传功能解析

    接下来我将详细讲解Java基于Servlet实现文件上传功能的完整攻略。该攻略分为以下几个步骤: 在HTML页面中添加文件上传表单 编写Servlet来处理文件上传请求 使用Apache的文件上传组件来解析文件上传请求 保存文件到指定位置并返回上传结果给用户 下面就来详细介绍这些步骤。 1. 在HTML页面中添加文件上传表单 首先,在你的HTML页面中添加一…

    Java 2023年5月20日
    00
  • Json字符串与Object、List、Map的互转工具类

    介绍:在Java中,经常会使用Json格式的字符串来传输数据,但是在Java程序内部我们又需要把Json字符串转换为Java对象来方便的操作数据。本文将介绍如何使用Json相关的工具类将Json字符串转换为Java对象,并将Java对象转换为Json格式的字符串。 将Json字符串转换为Java对象 当我们有一个Json格式的字符串需要转换为Java对象时,…

    Java 2023年5月26日
    00
  • Spring Boot security 默认拦截静态资源的解决方法

    Spring Boot Security默认会拦截所有请求,包括静态资源文件。这样会导致我们在访问静态资源时收到403(Forbidden)错误的响应。下面将介绍解决这个问题的方法。 第一种解决方法 第一种解决方法是在配置类上添加注解,忽略静态资源的拦截。 @Configuration @EnableWebSecurity public class Secu…

    Java 2023年6月3日
    00
  • java中的FileInputStream(输入流)

    Java中的FileInputStream是一种输入流,用于读取文件中的二进制数据或者字符数据。以下是详细的攻略: 1. FileInputStream的初始化 初始化FileInputStream需要提供文件路径作为输入参数,示例代码如下: FileInputStream fis = new FileInputStream("path/to/fi…

    Java 2023年5月26日
    00
  • Java数组添加元素实例

    下面是详细讲解”Java数组添加元素实例”的完整攻略: 1. 数组概述 Java中的数组是一种简单的数据结构,用于存储相同类型的数据。数组是一个连续的存储空间,其每个元素的内存地址是相邻的,所以可以通过索引来访问数组中的元素。 2. 数组添加元素的方法 Java中的数组是固定长度的,一旦创建后其长度就无法改变。因此,在需要添加元素的情况下,我们需要重新创建一…

    Java 2023年5月26日
    00
  • 详解Java线程同步器CountDownLatch

    详解Java线程同步器CountDownLatch 概述 CountDownLatch是Java的一个线程同步器,用途是让一些线程等待直到另一些线程完成一系列操作。它可以让我们控制一个线程在其他一些线程都完成后才开始执行,如保证某些共享变量在多个线程修改后再执行后续操作。 CountDownLatch是通过一个计数器来实现的,计数器初始值为指定的值,每当一个…

    Java 2023年5月18日
    00
  • 浅谈一个基础的SpringBoot项目该包含哪些

    一个基础的SpringBoot项目应该包含以下几个部分: 1. 项目结构 一般来说,一个Spring Boot 项目的包结构应该包含三个主要部分:application、config 和 controller。 application: 启动类的所在包,在 Spring Boot 项目中只能有一个,一般放在项目的根目录下。 config: 配置类所在的包,这…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部