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 或更高版本(如 11、17),就说明可以使用 JShell。
启动 JShell 非常简单,只需在终端输入:
jshell
回车后,你会看到类似这样的提示:
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
这时你已经进入 JShell 环境,可以开始输入代码了。
注意:JShell 会自动导入
java.lang包下的所有类,所以像System、String、Math这些都不需要手动导入。
基本操作指南
| 操作命令 | 作用说明 |
|---|---|
/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,就是那个让你“想得清、试得快”的工具。