REPL 代表读取-求值-打印循环(Read Evaluate Print Loop)。JShell 首次出现在 Java 9 中,它是一个交互式控制台。作为 REPL,JShell 允许用户在无需保存和编译 Java 代码的情况下直接在控制台中运行任意的 Java 代码片段。这一功能对于快速测试代码非常有用,例如评估正则表达式、检查字符串格式、日期格式等。
JShell 读取每一行输入,对其进行求值,然后打印出结果,接着再次准备接收下一行输入。
使用 JShell 的优点
JShell 的这一能力赋予开发者以下优势:
-
不需要编辑器来编写 Java 程序。JShell 本身即可作为编辑器执行 Java 代码。
-
使用 JShell 时,无需经历保存 Java 文件、编译和执行代码的循环。代码可以直接在 JShell 中测试,无需保存。
-
-
运行 JShell
打开命令提示符并键入 jshell
。
D:\test>jshell
| Welcome to JShell -- Version 20.0.2
| For an introduction type: /help intro
在 JShell 中,我们可以测试方法、类、表达式等。以下示例展示了 JShell 的一些特性。
在 JShell 中创建和调用方法
下面的代码片段展示了一个简单的“Hello World”程序。这里,我们创建了一个方法 greet()
,该方法包含一个打印消息 "Hello World!" 的语句。接着,我们调用了方法 greet()
并在控制台上打印了结果。
在 JShell 中的 Hello World 示例
jshell> void greet() { System.out.println("Hello World!");}
| created method greet()
jshell> greet()
Hello World!
jshell>
在 JShell 中创建变量
下面的代码片段展示了如何在 JShell 中创建变量。分号是可选的。我们也可以在 JShell 中创建对象。如果变量未初始化,那么它会被赋予默认值或如果是对象引用则为 null
。一旦创建了变量,就可以像最后一行那样使用它来打印其值。
示例
jshell> int i = 10
i ==> 10
jshell> String name = "Mahesh";
name ==> "Mahesh"
jshell> Date date = new Date()
date ==> Fri Feb 02 14:52:49 IST 2024
jshell> long l
l ==> 0
jshell> List list
list ==> null
jshell> name
name ==> "Mahesh"
在 JShell 中评估表达式
下面的代码片段展示了如何使用 JShell 评估表达式。在这里,我们传递了一个返回格式化字符串的语句。JShell 自动创建了一个 String 变量 $9
并赋给它结果。在下一个语句中,我们打印了 $9
。
示例
jshell> String.format("%d pages read.", 10);
$9 ==> "10 pages read."
jshell> $9
$9 ==> "10 pages read."
JShell 内置命令
JShell 提供了各种命令来列出创建的变量、方法、使用的导入等。一些重要的 JShell 命令包括:
-
/drop
— 此命令删除由名称、ID 或 ID 范围标识的代码片段。
-
-
-
-
-
-
示例:演示 /help
命令
我们可以使用 /help
选项查看所有命令。
jshell> /help
| Type a Java language expression, statement, or declaration.
| Or type one of the following commands:
| /list [<name or id>|-all|-start]
| list the source you have typed
| /edit <name or id>
| edit a source entry
| /drop <name or id>
| delete a source entry
| /save [-all|-history|-start] <file>
| Save snippet source to a file
| /open <file>
| open a file as source input
| /vars [<name or id>|-all|-start]
| list the declared variables and their values
| /methods [<name or id>|-all|-start]
| list the declared methods and their signatures
| /types [<name or id>|-all|-start]
| list the type declarations
...
示例:演示 /vars
命令
在以下示例中,我们使用 /vars
命令打印会话期间声明的变量。
C:\Users\Mahesh>jshell
| Welcome to JShell -- Version 20.0.2
| For an introduction type: /help intro
jshell> int i = 10
i ==> 10
jshell> String name="Mahesh"
name ==> "Mahesh"
jshell> /vars
| int i = 10
| String name = "Mahesh"
jshell>
示例:演示 /imports
命令
我们可以使用 /imports
命令检查 JShell 中可用的导入,如下所示:
jshell> /imports
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*
jshell>
退出 JShell
可以使用 /exit
命令退出 JShell,如下所示:
示例
jshell> /exit
| Goodbye
C:\Users\Mahesh>