Java中的JShell

时间:2020-01-09 10:34:50  来源:igfitidea点击:

Java Shell或者JShell是一种交互式命令行工具,用于学习Java编程语言并测试Java代码。 JShell是一个Read-Evaluate-Print Loop(REPL),它在输入声明,语句和表达式时对它们进行评估,并立即显示结果。这样,我们无需编写带有主要方法的完整Java类就可以测试一些小东西。许多编程语言(例如Python,Scala)已经提供了这样的命令外壳,以交互方式执行表达式,而Java 9甚至Java为此提供了JShell。

JShell的用法

例如,考虑一种情况,我们有一个40-50行的方法,并且作为该方法逻辑的一部分,我们确实需要获取以dd-mm-yyyy格式传递的日期的月份部分。
在IDE中编写此程序时,开发可能涉及以下过程:

  • 在IDE中编写完整的程序。

  • 编译程序

  • 修复所有编译时错误。

  • 运行程序。

  • 检查运行时或者逻辑错误

  • 如果发现任何此类错误,请编辑程序

  • 重复该过程。

使用JShell,我们可以一次编写一个程序元素,立即查看结果,并根据需要进行更改。因此,如果我们想验证从经过的日期中提取月份部分的方法,而不是像上面显示的那样运行整个代码并经历整个复杂过程,则可以在JShell中测试该元素以检查其正确性。满意后,可以将其复制到IDE。

jshell> String getMonth(String date){
   ...> return date.substring(date.indexOf('-') + 1, date.lastIndexOf('-'));
   ...> }
|  created method getMonth(String)

jshell> System.out.println(getMonth("10-05-2020"))
05

如何启动JShell

启动JShell之前的第一件事是确保我们已安装JDK 9或者更高版本。还要确保已设置Path,以便可以在任何地方而不是仅从Java安装目录中使用它。

要启动JShell,请在命令行上输入jshell命令。

F:\theitroad>jshell
|  Welcome to JShell -- Version 12.0.1
|  For an introduction type: /help intro

jshell>

我们也可以使用–v选项以详细模式启动JShell。

F:\theitroad>jshell -v
|  Welcome to JShell -- Version 12.0.1
|  For an introduction type: /help intro

jshell>

停止JShell

要退出JShell,请输入/ exit。

jshell> /exit
|  Goodbye

F:\theitroad>

打印你好世界消息

现在,当我们开始JShell会话时,我们首先打印" Hello World"消息。

jshell> System.out.println("Hello world from JShell");
Hello world from JShell

在JShell中声明变量

我们可以按常规方式在JShell中声明变量。请注意,变量一旦声明即可在整个会话中使用。

例如,声明一个int变量

jshell> int i = 10
i ==> 10
|  created variable i : int

由于会话以详细模式开始,因此它正在打印发生情况的完整描述。

该变量的值将保留整个会话。我们可以通过打印i的值进行测试。

jshell> System.out.println(i)
10

我们甚至可以在JShell中以不兼容的方式更改变量的类型。例如,在相同的JShell会话中,我的类型可以从int更改为String。

jshell> String i = "test";
i ==> "test"
|  replaced variable i : String
|    update overwrote variable i : int

jshell>

这里要注意的另一件事是,在某些表达式中分号不存在。如果未输入,JShell会自动将终止分号添加到完整代码段的末尾。

JShell中的临时变量

如果输入的表达式未分配给命名变量,则会自动创建一个暂存变量以存储值,以便以后可以引用该值。临时变量以" $"符号开头。

jshell> 3+ 4
 ==> 7
|  created scratch variable  : int

jshell> System.out.println();
7

JShell中的方法

我们可以在JShell中编写一个方法,然后从JShell调用该方法以立即对其进行测试。

jshell> int add(int a, int b){
   ...> return a + b;
   ...> }
|  created method add(int,int)
jshell> add(5,4)
 ==> 9
|  created scratch variable  : int

JShell中的正向引用

在JShell中,我们可以编写一个引用尚未定义的方法,变量或者类的方法。例如,考虑以下方法。

jshell> void arithmetic(int a, int b){
   ...> int sum = add(a, b);
   ...> System.out.println("Sum is " + sum);
   ...> int product = multiply(a, b);
   ...> System.out.println("Product is " + product);
   ...> }
|  created method arithmetic(int,int), however, it cannot be invoked until method multiply(int,int) is declared

如我们所见,JShell允许定义算术方法,但是警告说,必须先声明由算术()方法引用的multiple()方法,然后才能调用它。请注意,add()方法已经定义,因此没有警告。
我们可以通过尝试执行由于缺少必需元素而失败的算术方法来对其进行测试。

jshell> arithmetic(5, 6)
|  attempted to call method arithmetic(int,int) which cannot be invoked until method multiply(int,int) is declared

一旦定义了multiple()方法,就可以调用算术()方法。

jshell> int multiply(int a, int b){
   ...> return a * b;
   ...> }
|  created method multiply(int,int)
|    update modified method arithmetic(int,int)
jshell> arithmetic(5, 6)
Sum is 11
Product is 30

在JShell中定义类

我们也可以在JShell中定义一个类。

jshell> class HelloWorld{
   ...> void display(){
   ...> System.out.println("Hello World");
   ...> }
   ...> }
|  created class HelloWorld

然后这样称呼它

jshell> new HelloWorld().display();
Hello World

JShell命令

JShell命令控制环境并在会话中显示信息。任何JShell命令都以前导斜杠(/)开头,以将其与代码段区分开。

获取可用命令列表

我们可以通过键入正斜杠(/),然后按Tab来获取可用JShell命令的列表。

jshell> /
/!          /?          /drop       /edit       /env        /exit
/help       /history    /imports    /list       /methods    /open
/reload     /reset      /save       /set        /types      /vars

如果再次按Tab键,则会给出每个命令的简短说明。

/ vars命令

列出声明的变量及其值。

jshell> /vars
|    String x = "test"
|    String i = "test"
|    int  = 7
|    int  = 9

/ methods命令

列出已声明的方法及其签名

jshell> /methods
|    int add(int,int)
|    void arithmetic(int,int)
|    int multiply(int,int)

/ list命令

列出我们输入的来源

jshell> /list

   1 : System.out.println("Hello world from JShell");
   3 : System.out.println(i)
   4 : String x = "test";
   6 : System.out.println(i);
   7 : String i = "test";
   8 : 3+ 4
   9 : System.out.println();
  10 : int add(int a, int b){
       return a + b;
       }
  11 : add(5,4)
  13 : void arithmetic(int a, int b){
       int sum = add(a, b);
       System.out.println("Sum is " + sum);
       int product = multiply(a, b);
       System.out.println("Product is " + product);
       }
  14 : arithmetic(5, 6)
  15 : int multiply(int a, int b){
       return a * b;
       }
  16 : arithmetic(5, 6)
  17 : class HelloWorld{
       void display(){
       System.out.println("Hello World");
       }
       }
  18 : new HelloWorld().display();

/ imports命令

列出导入的项目,请注意,即使我们未明确导入任何软件包,默认情况下,JShell也会导入少量软件包。

jshell> /import
|    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.*

/ help 命令

获取有关使用jshell工具的信息

/exit命令

退出jshell工具