一、

Java 9于2017年发布,带来了许多重要的新特性和改进。其中,模块化系统和交互式JShell是两个备受关注的重要特性。模块化系统解决了Java应用在大型项目中的依赖管理和可维护性问题,而交互式JShell则提供了一个便捷的交互式编程环境,大大提高了开发效率。本文将详细介绍这两个特性,并探讨它们对Java开发的影响。

二、Java 9的模块化系统

1. 模块化系统概述

Java 9的模块化系统(Java Platform Module System,JPMS)是Jigsaw项目的核心成果。该系统允许开发者将代码分解成不同的模块,每个模块可以单独进行开发、编译和部署。模块之间通过严格的依赖关系进行管理,从而提高了代码的可维护性和可复用性。

2. 模块的定义和结构

一个模块本质上是一个被命名的、自包含的代码单元,包括一系列相关的包、资源(如图片和XML文件)以及一个模块符(module-info.java)。模块符用于定义模块的名称、依赖关系和对外提供的接口等信息。

3. 模块依赖关系

模块之间的依赖关系通过`requires`指令进行定义。例如,`requires moduleA;`表明当前模块依赖于`moduleA`。这种依赖关系在编译和运行时都会被检查,确保模块间的依赖关系得到满足。`requires transitive`指令用于指定传递依赖,使得依赖关系更加灵活和易于管理。

4. 模块的封装和访问控制

模块系统的一个重要特性是强封装。模块中的包默认是封装的,只有通过`exports`指令明确导出的包才能被其他模块访问。例如,`exports com.example.mypackage;`将允许其他模块访问`com.example.mypackage`包中的公共类型。`exports...to`指令可以进一步限制对导出包的访问,指定只有特定的模块可以访问。

5. 服务和服务使用

模块系统支持服务提供者接口(SPI)模式。模块可以通过`uses`指令指定其使用的服务接口,而服务提供者则通过`provides...with`指令提供服务的具体实现。这种机制使得服务的实现可以在运行时进行替换,提高了系统的灵活性和可扩展性。

6. 运行时镜像定制

Java 9引入了`jlink`工具,允许开发者为基于模块的Java应用创建自定义的运行时镜像。通过`jlink`,可以指定应用程序所需的模块,从而创建出一个精简的、仅包含必要模块的运行时环境。这大大减小了Java运行时环境的大小,提高了应用的启动速度和内存使用效率。

三、Java 9的交互式JShell

1. 交互式编程环境概述

Java 9新特性:模块化系统与交互式JShell

JShell是Java 9新增的一个交互式命令行工具,提供了一个Read-Eval-Print Loop(REPL)环境。在JShell中,可以直接输入Java表达式、语句和声明,并立即查看执行结果,无需像传统方式那样编写完整的类和方法。

2. JShell基本用法

启动JShell非常简单,只需在命令行中输入`jshell`即可进入交互式环境。在JShell中,可以进行各种操作,如定义变量、计算表达式、创建函数和类等。例如:

java

jshell> int a = 10

a ==> 10

jshell> int b = 20

b ==> 20

jshell> int sum = a + b

sum ==> 30

3. 定义函数和类

在JShell中,不仅可以进行简单的计算,还可以定义函数和类。例如:

java

jshell> int add(int num1, int num2) {

..> return num1 + num2;

..> }

| created method add(int,int)

jshell> add(5, 3)

$3 ==> 8

甚至可以定义内部类和匿名类:

java

jshell> class MyClass {

..> private int value;

..> public MyClass(int v) {

..> value = v;

..> }

..> public int getValue {

..> return value;

..> }

..> }

| created class MyClass

jshell> MyClass obj = new MyClass(42)

obj ==> MyClass@511d50c0

jshell> obj.getValue

$5 ==> 42

4. 查看和管理代码片段

JShell提供了多个命令来管理输入的代码片段。例如,`/list`命令列出所有已输入的代码片段,`/edit`命令用于编辑指定的代码片段,`/drop`命令用于删除指定的代码片段。`/save`命令可以将当前会话中的所有代码片段保存到文件中,方便后续使用。

5. 导入包和管理依赖

在JShell中,可以使用`/imports`命令查看已导入的包,也可以使用常规的`import`语句导入需要的包。例如:

java

jshell> import java.util.Date;

jshell> Date now = new Date;

now ==> Fri Jun 07 14:30:15 CST 2024

Java 9的模块化系统和交互式JShell为Java开发带来了显著的改进。模块化系统提高了代码的可维护性和可复用性,特别是在大型项目中优势明显。而交互式JShell提供了一个便捷的开发环境,大大提高了开发效率,尤其适合初学者和快速验证想法。这两个特性共同推动了Java在企业级应用和大型项目中的应用,也为未来的Java开发奠定了坚实基础。