JShell - Java 9中用于快速原型设计的新REPL工具

栏目: Java · 发布时间: 6年前

内容简介:REPL代表Read-Eval-Print-Loop。听起来有点神秘,但它只是编程语言的交互式shell的一个奇特名称。如今,许多语言已经提供了REPL。即使在JVM Groovy上,Kotlin,Scala和Clojure也已经拥有它。从版本9开始的Java最终有自己的REPL,称为JShell好吧,所以Java终于拥有了它新的闪亮的REPL。但它有什么好处呢?好吧,简而言之,它允许您将独立的Java代码片段写入控制台(READ),立即执行它们(EVAL),然后查看结果(PRINT)并继续记住您已编写的

REPL代表Read-Eval-Print-Loop。听起来有点神秘,但它只是编程语言的交互式 shell 的一个奇特名称。如今,许多语言已经提供了REPL。即使在JVM Groovy上,Kotlin,Scala和Clojure也已经拥有它。从版本9开始的 Java 最终有自己的REPL,称为JShell

好吧,所以Java终于拥有了它新的闪亮的REPL。但它有什么好处呢?好吧,简而言之,它允许您将独立的Java代码片段写入控制台(READ),立即执行它们(EVAL),然后查看结果(PRINT)并继续记住您已编写的内容(LOOP)。如果您想快速尝试一段代码,草拟算法,检查某些方法如何处理异常输入,为您的博客帖子创建和测试代码片段,它是一个完美的工具。您只需快速尝试一些一次性代码并立即看到结果。最好的部分是 - 它不需要大多数Java样板。

虽然原型设计和快速代码验证很重要,但还有另一个原因可以让REPL变得有用。特别是在一个冗长的语言中,如Java等样板文件。想象一下,您正在教授Java初学者。你需要写一个简单的hello world程序,只打印到控制台?可以使用带main方法的类。问题是您需要向学生展示他们现在不需要担心的许多概念,例如类,方法,静态,字符串数组等。然后,当您进行更改时,您需要重新编译并重新运行整个系统。

交互式控制台不需要使用main类,并立即显示输出。您可以尝试各种结构,并快速查看结果。您不需要任何IDE。您可以使用最少的设置和对所有高级概念的最少知识开始编程,当时只学习一个构造。这种高门槛也导致许多学校和机构放弃Java作为编程语言选择的介绍。教育方面实际上是JEP222中所述功能的主要动机。

运行JShell

JShell与JDK 9+安装捆绑在一起。它驻留在JDK \ bin文件夹中。例如在Windows上它可以在这里:

C:\Program Files\Java\jdk-9.0.4\bin\jshell.exe

要直接从控制台运行它,请确保将JDK \ bin添加到您的PATH。然后只需运行jshell命令。现在,让我们使用详细模式-v,这将有助于我们更好地了解幕后发生的事情。或者,您可以直接从bin目录运行可执行文件。最后一个选项是使用IDE集成。

如果你使用IntelliJ IDEA,你不必担心在类路径上使用JShell,因为IDEA直接在IDE中提供了与JShell开箱即用的出色集成。您将获得所有有用的功能,例如代码完成,语法突出显示,错误检测等。

若要从IDEA访问JShell,去工具→JShell控制台...。

C:\Users\vojtech> jshell -v
| Welcome to JShell -- Version 10.0.1
| For an introduction type: /help intro

jshell>

现在您处于交互模式,JShell会评估您编写的任何内容。要退出JShell只需键入/exit。

表达式

从JShell开始的最简单方法是编写一个简单的表达式。它可以是一个简单的数学表达式:

jshell> 7*(3+12)
$1 ==> 105
|  created scratch variable $1 : <b>int</b>

如您所见,表达式立即被评估,结果将打印到控制台。无需先声明任何变量。然而,为方便起见,我们创建了一个名为$ 1的临时变量,我们可以从现在开始使用它。请注意,变量的类型被推断为int。

然而,表达不限于如上所述的简单数学表达式。这不会很有用。你几乎可以用Java做任何事情。

jshell> Math.sqrt($1)+7
$2 ==> 17.246950765959596

首先,请注意我们能够使用上一个示例中的$ 1变量。在每个命令之间保留状态。另一个值得注意的特性是,正如您所看到的,在大多数情况下,分号是可选的。

变量

即使JShell在未将返回值分配给任何变量时为我们声明变量,通常最好声明自己的变量。如果仅为了描述性命名。您可以将它们声明为局部变量。

jshell> int myVariable = 42

一段时间后,您可能会混淆已经声明的变量以及它们的值。这是一个特定的命令 - 只需键入/vars。

如果您已经使用Java 10,则可以使用 var而不是显式声明类型

方法

如上所述,您可以不需要在任何类中而是直接在根级别声明变量,您可以对方法执行相同的操作。同样,您不必担心任何修饰符,例如public,static或final。您只需以返回类型和方法名称开头,并带有可能的参数:

jshell> String sayHello(String name) {
   ...> <b>return</b> <font>"Hello, my name is "</font><font>+name;
   ...> }
|  created method sayHello(String)

jshell> sayHello(</font><font>"Joe"</font><font>)
$7 ==> </font><font>"Hello, my name is Joe"</font><font>
|  created scratch variable $7 : String
</font>

在上面的示例中,您可以看到我们声明了一个方法然后调用它。请注意,与顶层不同,内部方法和类分号不是可选的。

常见的情况是当方法使用另一个尚未声明的方法或变量时。它被称为前向引用,JShell允许您这样做。但是,在声明所有依赖项之前,不能使用此类方法。

jshell> String myMethod(String name) {
   ...> <b>return</b> otherMethodNotDeclared();
   ...> }
|  created method myMethod(String), however, it cannot be invoked until method otherMethodNotDeclared() is declared

与/vars变量类似,您可以列出所有当前声明的方法/methods。

类型

顶级变量和方法很有用,但通常需要声明和使用常规类,枚举或接口。你可以像往常一样,这里没有特定的JShell。请记住,在这种情况下需要分号。您可以通过/types列出所有声明的类型。

jshell> <b>class</b> Person {
   ...>     <b>private</b> String name;
            [more code here]
   ...> }
|  created <b>class</b> Person

使用外部代码

如上例所示定义所有类是一项繁琐的任务。更重要的是,您通常希望使用JDK中已有的类甚至您自己的类。

对于JDK类,您可以import照常使用。为方便起见,默认情况下已导入许多常用类。不仅往常一样java.lang,而且java.io,java.math,java.util或java.nio.file。您可以列出所有当前导入/import。

当然,如果JShell无法访问所需的类,则导入将毫无用处。

您的类需要在类路径上。第一种选择是使用CLASSPATH环境变量。或者您可以在启动JShell时指定classpath:

jshell --class-path foo-1.0.0.jar

您可以直接从jshell定义类路径:

jshell> /env -class-path foo-1.0.0.jar

如果您使用的是Java 9模块系统,则可以在启动JShell时指定要导入的模块:

jshell --add-modules some.module

例外

好消息是JShell可以很好地处理异常。每当发生异常时,JShell都会捕获它,打印它并且您的会话不会终止。很酷的是,与常规Java不同,它不会强制您处理已检查的异常,这会删除大量的try-catch样板。

保存并加载您的工作

当您在更复杂的用例中使用JShell时,能够保存您的工作并在以后继续使用通常很方便。或者只是保存您的会话以供将来参考。幸运的是JShell支持使用/save保存和加载会话/open :

jshell> /save myfile.jsh

jshell> /open myfile.jsh

使用外部编辑器

虽然您可以直接在JShell控制台中编写和编辑所有内容,但它并不总是最好的方法。编辑可能繁琐且繁琐。使用专用的外部文本编辑器通常更好。要打开到目前为止在外部编辑器中输入的所有代码段,请键入/edit。

您可以配置自己的编辑器,一种方法是传达环境变量JSHELLEDITOR。或者,您可以直接从JShell设置编辑器。使用-retain选项可在会话之间保留此设置。

jshell> /set editor myEditor -retain

如果您的编辑器未打开PATH,则需要提供可执行文件的完整路径。

以编程方式使用JShell

一个非常有趣的选择是将Java应用程序与JShell集成。您可以以编程方式创建JShell实例,然后在您的应用程序中使用它。所有必需的类都在jdk.jshell。首先,您需要创建一个JShell实例,然后您可以使用它来评估代码片段。

JShell shell = JShell.create();
List<SnippetEvent> events = shell.;

该eval方法评估代码片段并返回在评估期间发生的 事件 列表。通过这些,您可以判断是否发生了一些异常以及代码段是否有效。要访问有关代码段本身的详细信息,您需要调用snippetEvent.snippet()。

JShell shell = JShell.create();
List<SnippetEvent> events = shell.;
SnippetEvent event = events.get(0);
Snippet snippet = event.snippet();
Snippet.Kind kind = snippet.kind();
String source = snippet.source();

要获取代码段的完整源代码,您可以使用snippet.source()。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design systems

Design systems

Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具