什么是交互式编程环境?重点词交互,在这样的编程环境中,你每输入一行代码,环境都会给你一个反馈,这就是交互式的编程环境。这种编程环境并不太适合工程化的复杂性需求,但在一些快速验证、简单计算之类的场景下还是非常好用的。其实交互式编程环境在其他高级语言中很早就有了,而 Java 直到 Java 9 才正式推出了这样的工具。
下面就来一起学习下,这个 Java 中的交互式编程环境 JShell。
快速入门
启动 JShell
打开终端,然后执行命令:jshell
,执行效果如下:
➜ ~ jshell | 欢迎使用 JShell -- 版本 9 | 要大致了解该版本, 请键入: /help intro jshell>
执行计算
在 jshell 中可以快速的执行计算操作并获得结果,比如这样:
jshell> 1+2 $1 ==> 3
定义变量
在 jshell 中也可以定义变量与函数,比如,你可以这样定义变量,并进行计算:
jshell> int a=1, b=2; a ==> 1 b ==> 2 jshell> int c = a + b c ==> 3
定义函数
在 jshell 中也可以函数来封装操作,比如下面就是一个定义求和函数并调用它的例子:
jshell> int sum(int a, int b){ ...> return a + b; ...> } | 已创建 方法 sum(int,int) jshell> int c = sum(1, 2) c ==> 3
定义类
在 jshell 中,定义一些简单的类,也是可以实现的,比如:
jshell> public class Calculate { ...> ...> public int a; ...> public int b; ...> ...> public int sum() { ...> return a + b; ...> } ...> } | 已创建 类 Calculate jshell> Calculate c = new Calculate(); c ==> Calculate@4fca772d jshell> c.a = 1 $9 ==> 1 jshell> c.b = 2 $10 ==> 2 jshell> c.sum() $11 ==> 3
当然了,这种场景其实就已经比较复杂了,这里其实搭配 Java 16 中新增的 record 来实现的话,会简单实用一些。
查看命令:/help
关于 jshell 常用命令,我们可以通过 /help
来查看:
jshell> /help | 键入 Java 语言表达式, 语句或声明。 | 或者键入以下命令之一: | /list [<名称或 id>|-all|-start] | 列出您键入的源 | /edit <名称或 id> | 编辑源条目 | /drop <名称或 id> | 删除源条目 | /save [-all|-history|-start] <文件> | 将片段源保存到文件 | /open <file> | 打开文件作为源输入 | /vars [<名称或 id>|-all|-start] | 列出已声明变量及其值 | /methods [<名称或 id>|-all|-start] | 列出已声明方法及其签名 | /types [<名称或 id>|-all|-start] | 列出类型声明 | /imports | 列出导入的项 | /exit [<integer-expression-snippet>] | 退出 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 [-all] | 您键入的内容的历史记录 | /help [<command>|<subject>] | 获取有关使用 jshell 工具的信息 | /set editor|start|feedback|mode|prompt|truncation|format ... | 设置配置信息 | /? [<command>|<subject>] | 获取有关使用 jshell 工具的信息 | /! | 重新运行上一个片段 -- 请参阅 /help rerun | /<id> | 按 ID 或 ID 范围重新运行片段 -- 参见 /help rerun | /-<n> | 重新运行以前的第 n 个片段 -- 请参阅 /help rerun | | 有关详细信息, 请键入 '/help', 后跟 | 命令或主题的名称。 | 例如 '/help /list' 或 '/help intro'。主题: | | intro | jshell 工具的简介 | keys | 类似 readline 的输入编辑的说明 | id | 片段 ID 以及如何使用它们的说明 | shortcuts | 片段和命令输入提示, 信息访问以及 | 自动代码生成的按键说明 | context | /env /reload 和 /reset 的评估上下文选项的说明 | rerun | 重新评估以前输入片段的方法的说明 jshell> /help | 键入 Java 语言表达式, 语句或声明。 | 或者键入以下命令之一: | /list [<名称或 id>|-all|-start] | 列出您键入的源 | /edit <名称或 id> | 编辑源条目 | /drop <名称或 id> | 删除源条目 | /save [-all|-history|-start] <文件> | 将片段源保存到文件 | /open <file> | 打开文件作为源输入 | /vars [<名称或 id>|-all|-start] | 列出已声明变量及其值 | /methods [<名称或 id>|-all|-start] | 列出已声明方法及其签名 | /types [<名称或 id>|-all|-start] | 列出类型声明 | /imports | 列出导入的项 | /exit [<integer-expression-snippet>] | 退出 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 [-all] | 您键入的内容的历史记录 | /help [<command>|<subject>] | 获取有关使用 jshell 工具的信息 | /set editor|start|feedback|mode|prompt|truncation|format ... | 设置配置信息 | /? [<command>|<subject>] | 获取有关使用 jshell 工具的信息 | /! | 重新运行上一个片段 -- 请参阅 /help rerun | /<id> | 按 ID 或 ID 范围重新运行片段 -- 参见 /help rerun | /-<n> | 重新运行以前的第 n 个片段 -- 请参阅 /help rerun | | 有关详细信息, 请键入 '/help', 后跟 | 命令或主题的名称。 | 例如 '/help /list' 或 '/help intro'。主题: | | intro | jshell 工具的简介 | keys | 类似 readline 的输入编辑的说明 | id | 片段 ID 以及如何使用它们的说明 | shortcuts | 片段和命令输入提示, 信息访问以及 | 自动代码生成的按键说明 | context | /env /reload 和 /reset 的评估上下文选项的说明 | rerun | 重新评估以前输入片段的方法的说明
查看定义的函数:/methods
jshell> /methods | int sum(int,int)
查看定义的变量:/vars
jshell> /vars | int $1 = 3 | int b = 2 | Calculate c = Calculate@4fca772d | int $9 = 1 | int $10 = 2 | int $11 = 3 | int $13 = 3
列出输入源条目:/list
执行后,可以看到之前在 jshell
中输入的内容清单:
jshell> /list 1 : 1+2 3 : int a=1, b=2; 5 : int sum(int a, int b){ return a + b; } 7 : public class Calculate { public int a; public int b; public int sum() { return a + b; } } 8 : Calculate c = new Calculate(); 9 : c.a = 1 10 : c.b = 2 11 : c.sum() 12 : Map a = new HashMap();
左侧的数字为条目 id,可以利用该 id,进行编辑和删除操作。
编辑源条目:/edit
上面通过 /list
列出了输入的条目信息,下面试试通过 /edit
编辑下,比如:
jshell> /edit 7
此时会弹出修改框,修改完成后,点击 accept 即可。
删除源条目:/drop
/drop
命令可以用来删除某个源条目,比如我们可以用下面的命令删除 id 为 12 的那行。
jshell> /drop 12 | 已删除 变量 a
保存文件:/save
如果想把这次编辑的内容保存下来,以便到其他环境执行,或者下次继续使用的话,可以通过 /save
来保存到文件里,比如这样:
jshell> /save aaa.txt
打开文件:/open
当我们换了一个 jshell 环境后,可以通过打开之前保存的文件来快速还原之前的执行内容,比如:
jshell> /open aaa.txt
重置 jshell:/reset
当我们要换一个内容编写的时候,需要清空之前执行的条目(清空 /list 的内容),这个时候就可以这样来实现:
jshell> /reset | 正在重置状态。
查看引入的包:/imports
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.*
查看定义的类:/types
jshell> /types | class Calculate
退出 jshell:/exit
jshell> /exit | Goodbye