jshell – Java Shell

时间:2020-02-23 14:35:22  来源:igfitidea点击:

之前我们研究了Java REPL,即jshell基础。
今天,我们将学习jshell或者java shell的更多功能。

shell

Java 9中引入了jshell或者Java Shell,以帮助开发人员快速运行简短的程序,而无需麻烦地创建类,主方法等。
我们可以简单地在jshell中声明变量,编写语句并执行它们。
我们还可以为当前的jshell会话编译类,然后在下一个语句中使用它。
在本教程中,我们将研究更多jshell功能。

jshell功能

Java Shell或者jshell支持以下功能:

  • 我们可以将其用作评估Java编程语言的声明,语句,表达式等的交互式工具。

  • 我们可以查看先前命令的历史记录。

  • jshell支持Tab-Completion功能。

  • Java Shell自动添加分号,因此我们无需显式添加分号。

  • 我们可以根据需要配置默认导入。

  • 我们可以根据需要配置默认定义。

在接下来的部分中,我们将通过一些有用的示例逐一探讨这些功能。

Java Shell算术运算

我们可以在jshell中执行算术运算,如下例所示。

jshell> 10+5
 ==> 15

jshell> 10/5
 ==> 2

jshell> 10/3
 ==> 3

jshell> 10.0/3
 ==> 3.3333333333333335

jshell> 10*5
 ==> 50

jshell>

如果观察上面的示例,我们会发现在Java Shell中测试算术运算非常容易。
我们可以像简单的数学表达式一样编写它们并获得结果,而无需使用分号。

Java Shell内部变量

如果再次浏览上一节的图像,我们可以清楚地观察到以下代码输出:

jshell> 10+5
 ==> 15

jshell在这里分配了一个新的内部变量" $1",以保存" +"算术运算的结果值。
进一步的运算结果也分配给变量$2,$3等。
您可以通过在Java Shell中键入theie名称来访问这些变量值。

我有一个简单的问题要问你。
Java Shell内部变量是final还是Immutable?即我们无法更改其价值?

让我们用一个简单的例子找出来。

jshell> 
 ==> 15

jshell> =20
 ==> 20

jshell> System.out.print(" value now = "+)
 value now = 20
jshell>

因此,这些内部变量是可变的,我们可以更改它们的值,如上面的代码所示。
还要注意,我们可以像其他任何变量一样在java语句中使用这些变量。

jshell制表符完成功能

Java Shell以非常好的方式支持Tab键,以避免键入很多字符并节省开发人员时间。
就像IDE支持一样,可以自动完成变量,函数或者类的名称。

现在让我们通过REPL探索此功能。
只需输入几个字符并按键盘上的" Tab"键,它将为您提供可用的提示来选择。
如果还有更多匹配,它将显示所有匹配,如下所示。
因此,请再输入几个字符以避免冲突。

下图显示了jshell选项卡完成功能示例。

Java Shell导入类型

Java Shell自动导入一些软件包来帮助我们。
我们可以使用/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.*
jshell>

我们可以使用这些包中的任何类,而无需显式导入它们。
这就是为什么我们可以使用Math类而不导入它的原因,如下面的示例所示。

jshell> Math.max(5,10)
 ==> 10

jshell> Math.min(5,10)
 ==> 5

但是,如果我们要测试任何其他与包相关的类或者接口,则需要使用外部导入。
否则,我们将得到错误,如下面的代码片段所示:

jshell> ByteBuffer buf = ByteBuffer.allocate(48);
|  Error:
|  cannot find symbol
|    symbol:   class ByteBuffer
|  ByteBuffer buf = ByteBuffer.allocate(48);
|  ^--------^
|  Error:
|  cannot find symbol
|    symbol:   variable ByteBuffer
|  ByteBuffer buf = ByteBuffer.allocate(48);
|                   ^--------^
jshell>

我们需要使用如下所示的import语句来导入整个包或者特定的类。

jshell> import java.nio.ByteBuffer

jshell> ByteBuffer buf = ByteBuffer.allocate(48);
buf ==> java.nio.HeapByteBuffer[pos=0 lim=48 cap=48]

jshell>

其中我们能够成功创建一个" ByteBuffer"对象,而不会出现任何问题,因为我们已经手动导入了该类。