继续发掘 JSHell ,刚刚无意中多按了两下 Tab
键,竟然发现了一个新功能,自动提示。哇塞。
JShell 中的自动提示功能
在 JShell 中输入代码片段时,随时可以使用 Tab
键来显示自动提示,而且这个提示功能还挺智能的,如果无法根据输入的内容确定具体的提示时,则提供一些可能的选项。
例如上一章节中我们定义的 volume()
方法,但我们调用方法时,可以先输入 vol
然后按下 Tab
键
shell> vol<tab>
因为 vol
开头的变量、方法和类只有 volume()
方法,所以会自动完成到以下步骤
jshell> volume(
如果我们再次按下 <Tab>
键,那么就会出现一些提示信息,比如提示我们再按一下就会提示可以作为该方法的参数和该方法的签名
jshell> volume( $14 $16 $2 cube( divide( volume( 签名: double volume(double radius) <再次按 Tab 可查看文档> jshell> volume(
如果再次按下 <Tab>
键,则会继续显示该方法的文档,如果有的话
<找不到文档> <再次按 Tab 可查看所有可能的输入提示; 可能的输入提示总计: 553> jshell> volume(
还可以继续按 <Tab>
键,但那样没啥大意义了...
如果项目可以多种方式完成,则会显示一组可能性,例如我们输入 System.c
然后按下 <Tab>
键会显示如下
jshell> System.c class clearProperty( console() currentTimeMillis() jshell> System.c
我们可以输入任意字符,然后按下 <Tab>
键来提示可能的输入项。而且光标可以出于任意位置。但是,一般情况下我们都会让光标出于末尾,这样才能有意义。
例如我们可以先输入 System.c
然后使用 <-
键把光标移动到 e
后面,再次按下 <Tab>
则显示如下
jshell> Syste<Tab>m.c jshell> Systemm.c
自动完成除了能够自动提示可能的方法、变量和类名外,如果光标位于 左括号 后面,还会提示 参数 可能自动完成的选项。例如我们先输入 "简单教程".startsWith(
然后按下 <Tab>
键,则会告诉我们可能的参数
jshell> "简单教程".startsWith( $4 $6 twice( x 签名: boolean String.startsWith(String prefix, int toffset) boolean String.startsWith(String prefix) <再次按 Tab 可查看文档> jshell> "简单教程".startsWith(
在这一步,如果再次按下 <Tab>
键则会显示纯文本格式的文档
jshell> "简单教程".startsWith( boolean String.startsWith(String prefix, int toffset) Tests if the substring of this string beginning at the specified index starts with the specified prefix. Parameters: prefix - the prefix. toffset - where to begin looking in this string. Returns: true if the character sequence represented by the argument is a prefix of the substring of this object starting at index toffset ; false otherwise. The result is false if toffset is negative or greater than the length of this String object; otherwise the result is the same as the result of the expression this.substring(toffset).startsWith(prefix) <按 Tab 可查看下一文档> jshell> "简单教程".startsWith(
片段转换
如果我们使用的类并没有导入到当前的上下文中,那么在首次引用时可以轻松导入所需的类,JShell 会提示一些可用的选项,并允许我们使用键盘快捷键将表达式转换为变量声明。
当然了,这个过程是通过同时按下 <Shift>
和 <Tab>
键,松开,再按下 <i>
键达到的。
注意: 仔细看这个说明文字,而且要返回练习,刚开始我都是错误的。
例如,我们可以先输入 new JFrame
然后同时按下 <Shift>
和 <Tab>
键,松开,再按下 <i>
键就会提示导入选项了
jshell> new JFrame<Shift + Tab> <i> 0: 不执行任何操作 1: import: javax.swing.JFrame 选项:
当出现选项的时候,就可以按下左边的数字来作出选择了
jshell> new JFrame 0: 不执行任何操作 1: import: javax.swing.JFrame 选项: Imported: javax.swing.JFrame jshell> new JFrame1
在按下 <Shift>
和 <Tab>
键后,接下来如果按错了,那么就会提示我们正确的方法,就在这里,我还发现了 v
键这个选项,用于将表达式转换为创建变量。
例如我们先输入 new JFrame("Demo")
然后按下 <Shift>
和 <Tab>
键,松开后在按下 v
键,光标就会出现在变量名称的后面
jshell> new JFrame("Demo")<Shift + Tab> <i> jshell> JFrame = new JFrame("Demo")
注意:输入的表达式必须有效或忽略转换请求。上面的示例中,在变量转换之前需要导入 JFrame
然后我们就可以在光标处输入变量名称 jframe
并按下回车键
jshell> JFrame jframe = new JFrame("demo") jframe ==> javax.swing.JFrame[frame0,0,23,0x0,invalid,hidden ... tPaneCheckingEnabled=true] | 已创建 变量 jframe : JFrame jshell>
如果表达式的结果类型尚未导入,那么在这种情况下,Shift + Tab v 提供导入和创建变量,如以下示例所示:
jshell> jframe.getGraphics() 0: 不执行任何操作 1: 创建变量 2: import: java.awt.Graphics. 创建变量 选项:
这种情况下,我们只要按下对应的数字即可
jshell> Graphics gc = jframe.getGraphics() gc ==> null | 已创建 变量 gc : Graphics jshell>