Java 中的读-求值-打印循环 (REPL)

2025年3月27日 | 阅读 4 分钟

读-求值-打印循环 (REPL) 是一个 shell 接口。该接口读取并求值输入的每一行,然后打印结果。读-求值-打印循环 帮助我们与处于特定状态的应用程序运行时进行交互。命令由 REPL 读取和求值,并打印结果。打印结果后,REPL 会返回到开始,读取、求值并打印我们的下一个输入。

Read-Eval-Print Loop (REPL) in Java

使用 REPL,我们可以轻松地编写和测试 Java 代码,而无需编译它,并直接在控制台上看到输出。

Java 还没有 REPL 吗?

当然,像 Java 这样成熟的语言应该有一个 REPL。但是,并非所有语言都拥有 REPL,Java 就是其中之一。Java 开发者对此的需求最大。Java 已经有了类似 REPL 的东西,那就是 Java Beanshell。但该项目并非一个功能齐全的 REPL,与其他语言相比有所不足。为此,在 2016 年,Java 9 发布了,它提供了一个功能齐全的 REPL 环境。

为什么 REPL 如此有用?

使用 REPL,我们无需使用 javac 命令来编译或测试我们的 Java 代码。在使用 REPL 之后,

  1. 无需编辑器来编写 Java 程序。
  2. 无需保存 Java 程序。
  3. 无需编译 Java 程序。
  4. 如果出现任何编译时或运行时错误,无需进行编辑。
  5. 无需重复过程。
Read-Eval-Print Loop (REPL) in Java

我们可以求值方法、类和语句,而无需创建类。甚至可以不创建类就编写 "Hello World" 程序。

使用 REPL 的要求

使用 REPL 只有一个要求,即我们的系统应安装有 Java 9 或更高版本。如果系统已安装 Java 9,我们就可以准备使用 REPL 了。要检查系统中当前的 Java 版本,请打开命令提示符并键入以下命令


Read-Eval-Print Loop (REPL) in Java

使用 REPL

以下是一些 REPL 的示例,我们将在此演示求值数学表达式、计算斐波那契数列、创建动态类、了解历史以及修改类。

示例 1:求值数学表达式

描述

在第一行,我们创建了一个 double 类型的变量 "a" 并将其初始值设置为 10。之后,我们找到变量 "a" 的平方并将其存储在同一个变量中。之后,我们简单地将 20 加到变量 "a" 上。Jshell 会将结果放入一个临时变量 "$3" 中。接下来,我们执行 "/vars" 命令,该命令显示了所有已创建的变量。最后,我们创建了一个 double 类型的变量 "data",并将数字 8.3 的 5 次方存储其中。

输出

Read-Eval-Print Loop (REPL) in Java

示例 2:计算斐波那契数列

描述

在前六行代码中,我们创建了一个用于斐波那契数列的方法。之后,我们使用 Jshell 的 /methods 命令,该命令显示了所有可用的方法。在接下来的两行中,我们通过传递整数值来测试 fibo() 方法。我们创建了一个数组 arr 来确定我们想要获取多少项斐波那契数列。接下来,我们使用 for-each 循环遍历 arr 的每个值。我们将 arr 的每个值传递给 fibo() 方法并打印其返回值。

输出

Read-Eval-Print Loop (REPL) in Java

示例 3:REPL 用于重用

描述

在上面的代码中,我们创建了一个与之前创建的具有相同返回类型和参数的 fibo() 方法。此时,Jshell 会用当前的方法覆盖之前的 "fibo()" 方法。接下来,我们向该函数传递 arr 的每个值,以确保我们的 fibo() 方法是否被覆盖。

输出

Read-Eval-Print Loop (REPL) in Java

示例 4:定义类

描述

在上面的代码中,我们创建了 "Student" 类,它包含姓名、年龄、课程和学期。我们创建了一个构造函数,在其中为这些变量设置值。在构造函数之后,我们创建了一个方法,该方法显示了类每个实例的所有变量的值。

输出

Read-Eval-Print Loop (REPL) in Java

示例 5:创建类的实例

描述

在上面的代码中,我们创建了类的两个实例,并为所有类变量向构造函数传递了值。接下来,我们运行 Jshell 命令来检查 s1 和 s2 变量是否已创建。最后,我们调用 showData() 方法来显示每个实例的数据。

输出

Read-Eval-Print Loop (REPL) in Java