一文学会如何使用Java的交互式编程环境 JShell
什么是交互式编程环境?重点词交互,在这样的编程环境中,你每输入一行代码,环境都会给你一个反馈,这就是交互式的编程环境。这种编程环境并不太适合工程化的复杂性需求,但在一些快速验证、简单计算之类的场景下还是非常好用的。其实交互式编程环境在其他高级语言中很早就有了,而Java直到Java 9才正式推出了这样的工具。
下面就来一起学习下,这个Java中的交互式编程环境JShell。
JShell快速入门
我正在连载Java新特性学习专栏,欢迎关注公众号程序猿DD,第一时间获得推送!沉浸式阅读可在浏览器打开该链接:https://www.didispace.com/java-features/
本期内容视频版本如下:
启动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的那行Map a = new HashMap();
jshell> /drop 12
| 已删除 变量 a
可以看到,执行后,也给出了提示:定义的Map类型的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
我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!
推荐阅读
你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。