前面的章节中我们有简要的提到了几个 JShell 中的命令,比如 /help
显示帮助信息, /list
列出所有输入的代码片段等。
JShell 提供了丰富的命令,用于控制环境上下文和在会话中显示信息。
JShell 中的命令和代码片段是不一样的,命令都是以前导的反斜杠 ( /
) 开头,比如要显示所有已经定义的变量,可以使用 /var
,要显示所有已经定义的方法,可以使用 /methods
,要显示所有已经定义的类型,可以使用 /types
,要显示所有输入的代码片段,可以使用 /list
。
我们分别在 JShel 中演示下刚刚提到的那些命令。( 演示的结果基于前一章节 Java Shell 指南: 代码片段 ( 一 ) )
jshell> /vars | int $2 = 4 | String $4 = "简单教程简单教程" | String $6 = "Twice:简单教程" | String x = "简单教程" | BigDecimal PI = 3.141592653589793238462643383 | double $14 = 0.0 | int $16 = 0 | JFrame jframe = javax.swing.JFrame[frame0,0,23,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=demo,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] | Graphics gc = null jshell> /methods | String twice(String) | double volume(double) | 它无法调用, 直至 此错误已更正: | 二元运算符 '*' 的操作数类型错误 | 第一个类型: double | 第二个类型: java.math.BigDecimal | return 4.0 / 3.0 * PI * cube(radius); | ^------------^ | double cube(double) | int divide(int,int) jshell> /list 2 : 2 + 2 4 : twice("简单教程") 5 : String twice(String s) { return "Twice:" + s; } 6 : twice("简单教程") 8 : String x = "简单教程"; 9 : double volume(double radius) { return 4.0 / 3.0 * PI * cube(radius); } 10 : double cube(double x) { return x * x * x; } 13 : BigDecimal PI = new BigDecimal("3.141592653589793238462643383"); 14 : volume(5) 15 : int divide(int x, int y) { return x / y; } 16 : divide(5, 0) 17 : import javax.swing.JFrame; 18 : JFrame jframe = new JFrame("demo"); 19 : import java.awt.Graphics; 20 : Graphics gc = jframe.getGraphics(); jshell> /types jshell>
请注意,这些命令只会显示变量的类型和值,以及方法的签名。
JShell 还有一个默认的启动脚本,它会在 JShell 启动之前以静默方式自动执行,这个脚本会导入一些经常用到的类和包,使得我们可以快速的进行代码试验。
但是这个默认启动的脚本导入的代码,并不会通过 /lists
列出来,除非使用 /list -all
或 /list -start
命令
前者会显示所有的代码片段,包括默认脚本导入的类和包,后者只会显示启动时默认脚本导入的包。
jshell> /list -all s1 : import java.io.*; s2 : import java.math.*; s3 : import java.net.*; s4 : import java.nio.file.*; s5 : import java.util.*; s6 : import java.util.concurrent.*; s7 : import java.util.function.*; s8 : import java.util.prefs.*; s9 : import java.util.regex.*; s10 : import java.util.stream.*; 1 : int x = 30; 2 : 2 + 2 3 : String twice(String s) { return s +s; } 4 : twice("简单教程") 5 : String twice(String s) { return "Twice:" + s; } 6 : twice("简单教程") 7 : int x = 45; 8 : String x = "简单教程"; 9 : double volume(double radius) { return 4.0 / 3.0 * PI * cube(radius); } 10 : double cube(double x) { return x * x * x; } 11 : BigDecimal PI = new BigDecimal("3.141592653589793238462643383"); 12 : double PI = 3.1415926535; 13 : BigDecimal PI = new BigDecimal("3.141592653589793238462643383"); 14 : volume(5) 15 : int divide(int x, int y) { return x / y; } 16 : divide(5, 0) e1 : list e2 : Systemm.c 17 : import javax.swing.JFrame; e3 : new JFrame1 e4 : jframe = new JFrame("Demo") 18 : JFrame jframe = new JFrame("demo"); 19 : import java.awt.Graphics; 20 : Graphics gc = jframe.getGraphics(); jshell> /list -start s1 : import java.io.*; s2 : import java.math.*; s3 : import java.net.*; s4 : import java.nio.file.*; s5 : import java.util.*; s6 : import java.util.concurrent.*; s7 : import java.util.function.*; s8 : import java.util.prefs.*; s9 : import java.util.regex.*; s10 : import java.util.stream.*;
可以看到,默认的启动脚本导入的包和类都是经常会用到的。如果你想要定制默认的启动条目,可以使用 /set start
命令。有关次命令的详细信息,可以输入 /help /set start
查看。
另一方面,也可以使用 /save -start
命令将当前启动脚本保存为你自己的启动脚本的入口脚本。
此外, /exit
你知道的,用于退出 JShell。 /save
用于保存代码片段,/open
用于从外部文件中导入代码片段,还有一些其它的命令,我们就不一一介绍了。
反正有任何疑问,直接输入 /help
基本就能解决了。
JShell 命令的自动完成功能
与片段自动完成类似,当我们输入命令和命令选项时,可以使用 <Tab>
键自动完成命令或选项。如果 JShell 无法根据输入的内容确定如何自动完成,则会提供可能的选择。
例如下面的示例,我们可以输入 /
后直接按下 <Tab>
键,然后就会提示接下来如何输入
jshell> /<Tab> /! /? /drop /edit /env /exit /help /history /imports /list /methods /open /reload /reset /save /set /types /vars <再次按 Tab 可查看提要> jshell> /
如果前置输入能够导致接下来的输入唯一,那么就会自动完成命令,例如,我们先输入 /l
然后按下 <Tab>
键,这样就会自动完成为 /list
命令
jshell> /l<Tab> jshell> /list
除了命令自动完成外,命令的选项也可以自动完成,当我们输入 -
后再按下 <Tab>
就就会给出一些提示
jshell> /list -<Tab> -all -history -start <再次按 Tab 可查看提要> jshell> /list -
注意: 一般情况下,首次按下 <Tab>
键都会提示如果再次按下则会显示命令概要的消息
jshell> /list -<Tab> -all -history -start <再次按 Tab 可查看提要> jshell> /list -<Tab> 列出您键入的源 <再次按 Tab 可查看完整文档> jshell> /list -<Tab> 显示前面带有其片段 ID 的片段。 /list 列出您键入的或使用 /open 读取的当前活动的代码片段 /list -start 列出评估的启动片段 /list -all 列出所有片段,包括失败的片段、覆盖的片段、删除的片段和启动片段 /list <名称> 列出具有指定名称的片段(特别是活动片段) /list <id> <再次按 Tab 可查看下一页> jshell> /list -
如果输入的选项是唯一的,那么它也会自动完成,例如当我们输入 /list -a
后按下 <Tab>
键,则会自动补全为 /list -all
jshell> /list -a<Tab> jshell> /list -all
另外,命令的自动完成也适用于代码片段名称,例如变量名、方法名和类名。例如我们输入 /ed v
命令后,如果按下 <Tab>
键,则会自动补全为 /ed volume
jshell> /ed v<Tab> jshell> /ed volume
对于 /open
命令,还可以在参数位置提示所有可以打开的文件名
jshell> /open <再次按 Tab 可查看所有可能的输入提示; 可能的输入提示总计: 123> jshell> /open
当然了,因为我们没有保存任何代码片段,所有可供打来的文件列表就是空的。并且,如果想要输入的文件名是唯一的,则会自动补全那个文件名。我这里就不演示了。
命令缩写
其实 JShell 中的命令已经很短了,而且容易记住,但即便如此,JShell 还是提供了某些命令的缩写功能。
命令缩写可以减少我们的输入,唯一的要求就是缩写的命令必须是唯一的。而且命令,/set
子命令,命令参数和命令选项都可以缩写。
例如 /list
的缩写为 /l
,例如 /list -all
的缩写为 /l -a
。例如,我们可以使用 /l -a
来代替 list -all
输出所有的代码片段
jshell> /l -a s1 : import java.io.*; s2 : import java.math.*; s3 : import java.net.*; s4 : import java.nio.file.*; s5 : import java.util.*; s6 : import java.util.concurrent.*; s7 : import java.util.function.*; s8 : import java.util.prefs.*; s9 : import java.util.regex.*; s10 : import java.util.stream.*; 1 : int x = 30; 2 : 2 + 2 3 : String twice(String s) { return s +s; } 4 : twice("简单教程") 5 : String twice(String s) { return "Twice:" + s; } 6 : twice("简单教程") 7 : int x = 45; 8 : String x = "简单教程"; 9 : double volume(double radius) { return 4.0 / 3.0 * PI * cube(radius); } 10 : double cube(double x) { return x * x * x; } 11 : BigDecimal PI = new BigDecimal("3.141592653589793238462643383"); 12 : double PI = 3.1415926535; 13 : BigDecimal PI = new BigDecimal("3.141592653589793238462643383"); 14 : volume(5) 15 : int divide(int x, int y) { return x / y; } 16 : divide(5, 0) e1 : list e2 : Systemm.c 17 : import javax.swing.JFrame; e3 : new JFrame1 e4 : jframe = new JFrame("Demo") 18 : JFrame jframe = new JFrame("demo"); 19 : import java.awt.Graphics; 20 : Graphics gc = jframe.getGraphics(); jshell>
另外,/set
的缩写是 /se
,feedback
的缩写是 fe
。 并且唯一以 v
开头的反馈模式是 verbose
的,假设不存在以 v
开头的自定义反馈模式,那么我们可以使用下面的命令将反馈模式设置为 verbose
jshell> /se fe v | 反馈模式: verbose
需要注意的是,/s
并不是一个缩写,因为 /save
和 /set
两个命令都以相同的字母开头。如有疑问,你可以使用 <Tab>
自动补全查看选项
jshell> /s /save /set <再次按 Tab 可查看提要> jshell> /s