1.6 JDK9新增的jshell工具

1.6 JDK9新增的jshell具

JDK9工具的一大改进就是提供了jshell工具,它是一个REPL(Read-Eval-Print Loop)工具,该工具是一个交互式的命令行界面,可用于执行Java语言的变量声明、语句和表达式,而且可以立即看到执行结果。因此,我们可以使用该工具来快速学习Java或测试Java的新API

在没有jshell时,开发者想要测试某个新功能或新API,通常要先打开IDE工具,然后新建一个测试项目,再新建一个类,最后才可以开始写代码来测试新功能或新API。这显得很麻烦,而jshell的出现解决了这个痛点。

jshell位于JDK安装目录的bin路径下,如果读者按前面介绍的方式配置了PATH环境变量,那么输入shell命令应该即可进入shell交互模式;如果系统提示找不到jshell命令,那么肯定是环境变量配置错误。

查看jshell帮助信息

进入shell交互模式后,可执行/help来查看帮助信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
jshell> /help
| 键入 Java 语言表达式, 语句或声明。
| 或者键入以下命令之一:
| /list [<名称或 id>|-all|-start]
| 列出您键入的源
| /edit <名称或 id>
| 编辑按名称或 id 引用的源条目
| /drop <名称或 id>
| 删除按名称或 id 引用的源条目
| /save [-all|-history|-start] <文件>
| 将片段源保存到文件。
| /open <file>
| 打开文件作为源输入
| /vars [<名称或 id>|-all|-start]
| 列出已声明变量及其值
| /methods [<名称或 id>|-all|-start]
| 列出已声明方法及其签名
| /types [<名称或 id>|-all|-start]
| 列出已声明的类型
| /imports
| 列出导入的项
| /exit
| 退出 jshell
| /env [-class-path <路径>] [-module-path <路径>] [-add-modules <模块>] ...
| 查看或更改评估上下文
| /reset [-class-path <路径>] [-module-path <路径>] [-add-modules <模块>]...
| 重启 jshell
| /reload [-restore] [-quiet] [-class-path <路径>] [-module-path <路径>]...
| 重置和重放相关历史记录 -- 当前历史记录或上一个历史记录 (-restore)
| /history
| 您键入的内容的历史记录
| /help [<command>|<subject>]
| 获取 jshell 的相关信息
| /set editor|start|feedback|mode|prompt|truncation|format ...
| 设置 jshell 配置信息
| /? [<command>|<subject>]
| 获取 jshell 的相关信息
| /!
| 重新运行上一个片段
| /<id>
| 按 id 重新运行片段
| /-<n>
| 重新运行前面的第 n 个片段
|
| 有关详细信息, 请键入 '/help', 后跟
| 命令或主题的名称。
| 例如 '/help /list' 或 '/help intro'。主题:
|
| intro
| jshell 工具的简介
| shortcuts
| 片段和命令输入提示, 信息访问以及
| 自动代码生成的按键说明
| context
| /env /reload 和 /reset 的评估上下文选项

退出jshell

也可执行/exit退出jshell

执行你希望测试的Java代码,比如执行System.out.println("HelloWorld"),jshell不要求以分号结尾。

jshell常用命令

  • /list:列出用户输入的所有源代码。
  • /edit:编辑用户输入的第几条源代码。比如/edit2表示编辑用户输入的第2条源代码。jshell会启动一个文本编辑界面让用户来编辑第2条源代码
  • /drop:删除用户输入的第几条源代码。
  • /save:保存用户输入的源代码。
  • /vars:列出用户定义的所有变量。
  • /methods:列出用户定义的全部方法
  • /types:列出用户定义的全部类型。

测试jshell

jshell界面中输入如下语句:

定义变量

1
int a = 20

上面语句用于定义一个变量。接下来输入/vars命令,即可看到shell列出了用户定义的全部变量。系统生成如下输出:

查看变量

1
2
jshell> /vars
| int a = 20

输出语句

shell界面中输入如下语句:

1
System.out.println("HelloWorld!")

运行效果如下:

1
2
jshell> System.out.println("HelloWorld!")
HelloWorld!

显示所有代码

1
/list
1
2
3
4
jshell> /list

1 : int a = 20;
2 : System.out.println("HelloWorld!")

这个输出结果又两个,前面的数字是id,这个id是自增的,新增的命令或者修改的命令都会加1

修改之前的代码

1
/edit id

这里的id例如修改第2行

1
/edit 2

jshell会启动一个图形化的编辑器让你来编辑这一行,如下图所示:
这里有一张图片
在这个弹出的编辑器中,将上面的代码

1
System.out.println("HelloWorld!")

修改为:

1
System.out.println(a);

然后点击Accept按钮,然后点击Exit退出.可以看到如下运行结果:

1
2
jshell> /edit 2
20

删除某行代码

1
/drop id

例如删除上面的第二行代码:

1
/drop 2

运行结果:

1
2
3
4
5
6
jshell> /drop 2

jshell> /list

1 : int a = 20;
3 : System.out.println(a);

可以看到,现在第二行代码,已经被删除掉了,但是前面的id不会

执行某行代码

1
/id

例如

cmd中临时使用JDK9

需求

我在使用旧版本的java8,但是如果我想使用Java9的新特性,例如jshell.

使用set命令设置临时的path环境变量

cmd中的set命令用于设置临时的环境变量,所以在path环境变量的前面添加JDK9安装路径下的bin路径即可使用jshell:

1
set path=E:\java\java9\jdk-9\bin;%path%

效果如下:

1
2
3
4
5
6
7
G:\Desktop>echo %path%
E:\java\java8\jdk-8u221\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;.........;E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin;

G:\Desktop>set path=E:\java\java9\jdk-9\bin;%path%

G:\Desktop>echo %path%
E:\java\java9\jdk-9\bin;E:\java\java8\jdk-8u221\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;.........;E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin;

这样就可以在当前cmd中使用jshell,设置成功效果:

1
2
3
G:\Desktop>jshell
| 欢迎使用 JShell -- 版本 9
| 要大致了解该版本, 请键入: /help intro