Java 9 REPL (JShell)(详细教程)

Java 9 REPL (JShell):让代码实验变得像写日记一样简单

你有没有过这样的经历?想试试一个新语法,或者验证某个方法的行为,但又不想新建一个项目、写 main 方法、编译运行……来回折腾,效率低得让人想放弃。别急,Java 9 引入的 Java 9 REPL (JShell) 正是为了解决这类“小实验”场景而生的。

想象一下,你不再需要“启动 IDE → 创建类 → 写 main 方法 → 编译 → 运行”的繁琐流程,而是像打开一个命令行终端,直接输入代码,立刻看到结果。这就像你用笔记本随手记下灵感,写完马上就能看到反馈,效率提升不止一个档次。

Java 9 REPL (JShell) 是 Java 9 新增的一个交互式工具,它允许你在不写完整类结构的前提下,直接运行 Java 代码片段。无论是测试语法、验证算法逻辑,还是快速学习新特性,它都堪称“程序员的草稿本”。


什么是 JShell?它能做什么?

JShell 是 Java 9 引入的交互式命令行工具,全称是 Java Shell,它允许开发者以“逐行输入、即时执行”的方式运行 Java 代码。你可以把它看作是 Python 的 >>> 交互环境,或者 Ruby 的 irb,但它是专为 Java 设计的。

它支持以下能力:

  • 直接输入表达式并立即看到结果(如 2 + 3
  • 定义变量、方法、类、接口
  • 保存和重用代码片段
  • 查看已定义的元素(比如 jshell> /list
  • 支持代码补全(Tab 键自动补全类名、方法名)

举个例子:你刚刚学了 List 接口,想试试 add 方法怎么用,不用写完整类,直接在 JShell 中输入:

jshell> List<String> list = new ArrayList<>();
jshell> list.add("Hello");
jshell> list.add("World");
jshell> list

立刻就能看到输出:[Hello, World]

是不是比写一个 Main 类快多了?


如何启动 JShell?环境准备与基本操作

在使用 JShell 之前,确保你的系统中安装了 Java 9 或更高版本。可以通过以下命令检查:

java -version

如果输出中包含 9 或更高版本(如 1117),就说明可以使用 JShell。

启动 JShell 非常简单,只需在终端输入:

jshell

回车后,你会看到类似这样的提示:

|  Welcome to JShell -- Version 9.0.4
|  For an introduction type: /help intro

这时你已经进入 JShell 环境,可以开始输入代码了。

注意:JShell 会自动导入 java.lang 包下的所有类,所以像 SystemStringMath 这些都不需要手动导入。

基本操作指南

操作命令 作用说明
/list 查看当前已定义的变量、方法、类等
/vars 只列出变量
/methods 只列出方法
/types 只列出类和接口
/edit <name> 编辑已定义的代码(如 /edit myMethod
/drop <name> 删除某个变量、方法或类
/help 查看帮助信息
/exit 退出 JShell

这些命令以斜杠 / 开头,是 JShell 内置的交互指令,非常实用。


实战演练:从变量到方法,一步步上手

我们来通过几个真实场景,感受 JShell 的便捷。

定义变量与基本运算

在 JShell 中,你可以直接定义变量并赋值:

jshell> int age = 25
age ==> 25

这里 ==> 25 表示变量 age 的值为 25。JShell 会自动推断类型,你也可以显式声明:

jshell> double price = 99.9
price ==> 99.9

接着做点运算:

jshell> double total = price * 1.1  // 加税
total ==> 109.89

你甚至可以直接输入表达式,JShell 会立即计算结果:

jshell> Math.sqrt(16)
$2 ==> 4.0

注意:JShell 会自动为每次表达式结果分配一个临时变量名(如 $2),方便后续引用。


创建方法与调用

JShell 支持定义方法,但需要使用 static 关键字,因为不能在顶层定义非静态方法。

jshell> static int add(int a, int b) {
   ...>     return a + b;
   ...> }

输入完成后,JShell 会自动识别方法定义,无需手动“保存”或“编译”。现在你可以调用它:

jshell> add(3, 5)
$4 ==> 8

小贴士:JShell 支持 Tab 补全。当你输入 add( 时,按 Tab 键,它会自动补全方法名,避免拼写错误。


使用集合与遍历

JShell 也支持集合操作。我们可以快速测试 List 的用法:

jshell> import java.util.List;
jshell> import java.util.ArrayList;
jshell> List<String> fruits = new ArrayList<>();
fruits ==> []

添加元素:

jshell> fruits.add("苹果");
jshell> fruits.add("香蕉");
jshell> fruits.add("橙子");
jshell> fruits
$6 ==> [苹果, 香蕉, 橙子]

遍历集合:

jshell> for (String fruit : fruits) {
   ...>     System.out.println("水果:" + fruit);
   ...> }
水果:苹果
水果:香蕉
水果:橙子

这种写法和在普通 Java 程序中几乎一样,但省去了 main 方法和 public class 的框架。


高级功能:保存、重用与调试

JShell 不仅是“玩具”,它还能用于真实开发中的快速验证。

保存代码片段(/save)

如果你写了一段重要的代码,比如一个工具方法,可以用 /save 命令保存到文件:

jshell> /save ~/myUtils.java

这会将当前会话中所有已定义的变量、方法、类等保存为 myUtils.java 文件,你可以在 IDE 中打开它继续使用。

重新加载文件(/open)

当你修改了文件,可以使用 /open 重新加载:

jshell> /open ~/myUtils.java

JShell 会自动解析并重新定义其中的内容,非常方便做迭代式开发。

调试技巧:查看变量值

有时候你不确定某个变量的值,可以用 /vars 查看:

jshell> /vars
|    int age = 25
|    double price = 99.9
|    List<String> fruits = [苹果, 香蕉, 橙子]

这相当于一个“变量快照”,帮助你快速排查问题。


为什么 JShell 对初学者特别友好?

很多初学者在学习 Java 时,最大的障碍就是“写不出第一个程序”。明明知道怎么写 System.out.println("Hello"),但每次都要创建一个 HelloWorld.java 文件、写 public class、写 main 方法,再编译运行。

JShell 把这个过程从“五步”简化为“一步”:直接输入代码,回车即得结果

它像一个“代码沙盒”,让你可以:

  • 随意试错,不怕出错
  • 快速验证语法
  • 学习新 API 时不用建项目
  • 记录学习笔记,随时调用

比如你刚学 Optional,可以这样测试:

jshell> import java.util.Optional;
jshell> Optional<String> opt = Optional.of("Hello");
opt ==> Optional[Hello]
jshell> opt.isPresent()
$8 ==> true
jshell> opt.get()
$9 ==> Hello

整个过程不到 30 秒,效率远超传统开发流程。


总结:JShell 是程序员的“第二大脑”

Java 9 REPL (JShell) 不是替代完整项目的工具,而是提升开发效率的“加速器”。它特别适合:

  • 学习 Java 新语法
  • 快速验证算法逻辑
  • 调试小片段代码
  • 写技术笔记和实验记录

它让编程变得更“轻量”、“即时”、“有趣”。当你不再为“写个例子要建项目”而烦恼,你会发现,编程的本质其实是“思考”和“验证”,而不是“流程”。

无论你是初学者,还是有经验的开发者,JShell 都值得你花 10 分钟试一试。打开终端,输入 jshell,然后写下第一行代码——你会发现,原来代码可以这么自由。

真正的编程高手,不是写得多,而是想得清、试得快。JShell,就是那个让你“想得清、试得快”的工具。