java 9 shell_目睹Java9中的Java shell(JShell)的威力

Java9引入了JShell,一个交互式的REPL工具,允许开发者快速测试和调试代码片段。JShell使用编译器API和Java调试接口,提供代码分析、补全和替换功能。通过这个工具,可以避免完整编译和运行的流程,提高开发效率。例如,它可以方便地显示变量的方法、执行查询和命令,甚至支持流操作。JShell的引入使得Java平台更加接近现代开发实践,提供了类似LISP机器的便捷体验。
摘要由CSDN通过智能技术生成

在JavaOne 2016的主题演讲中,Java平台组的首席架构师Mark Reinhold指出Java 9并不仅仅是Jigsaw,针对Java 9,一共包含了 85个JEP 。我在这里会关注一个他所强调的Java新特性, JEP 222 ,那就是Java shell(也被称为JShell)。

借助JShell,Java 9能够让开发人员使用REPL(Read-Eval-Print loop),这是一个交互式的工具,它会计算用户的输入并打印输出,输出的内容要么是一个值要么是一个状态变更。

JShell是什么?

JShell是一个API和工具,它能够帮助计算代码片段的值。代码片段必须要遵循Java语言规范(Java Language Specification,JLS)的语法。JShell也能够执行查询和命令。命令和片段的区别在于,命令要以一个斜线开头,可以参考如下的样例:

jshell> /import

| import java.util.*

| import java.io.*

| import java.math.*

| import java.net.*

| import java.util.concurrent.*

| import java.util.prefs.*

| import java.util.regex.*

JShell状态其实是模仿了一个JVM实例。JShell会借助编译器API(Compiler API)来进行代码分析、tab代码补全和原始代码片段的解析,它使用Java调试接口(Java Debug Interface,JDI)实现了代码替换功能。

如果用户不喜欢交互式界面的话,还可以使用批量脚本。

JavaOne上展现的JShell样例

在介绍Reinhold JavaOne上的样例之前,我想要补充一句,如果你使用最新版本的Java 9 SDK并输入 java –version 的话,那么会发现现在的版本号字符串会有所变更,如下所示:

$ java -version

java version "9-ea"

Java(TM) SE Runtime Environment (build 9-ea+136)

Java HotSpot(TM) 64-Bit Server VM (build 9-ea+136, mixed mode)

我们可以与旧的格式进行对比:

java version "1.8.0_91"

Java(TM) SE Runtime Environment (build 1.8.0_91-b14)

Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

这种变更是由 JEP 223 所引入的新模式带来的。目前的版本字符串更易于解析,并且更符合当前行业实践所强调的 语义化版本(Semantic Versioning) 。这种新的模式能够帮助我们更容易地识别主版本(major)、小版本(minor)或安全升级的发布版本。

在上面的样例中,预发布识别符( ea ——读作“早期访问”)前面会有一个“-”,紧接着是一个“+”号,随后是这次构建所对应的构建号( 136 )。

回到样例上来,如果你在命令行输入“ jshell ”的话,将会看到如下所示的JShell提示:

$ jshell

| Welcome to JShell -- Version 9-ea

| For an introduction type: /help intro

jshell>

如果你输入一个像下面这样的简单String声明,就能看到所有可调用的方法(包括重载的方法):

jshell> String x = "foo bar baz"

x ==> "foo bar baz"

jshell> x.

charAt( chars() codePointAt(

codePointBefore( codePointCount( codePoints()

compareTo( compareToIgnoreCase( concat(

contains( contentEquals( endsWith(

equals( equalsIgnoreCase( getBytes(

getChars( getClass() hashCode()

indexOf( intern() isEmpty()

lastIndexOf( length() matches(

notify() notifyAll() offsetByCodePoints(

regionMatches( replace( replaceAll(

replaceFirst( split( startsWith(

subSequence( substring( toCharArray()

toLowerCase( toString() toUpperCase(

trim() wait(

jshell> x.substring(4,7)

$3 ==> "bar"

jshell> Arrays.asList(x.split(""))

$5 ==> [f, o, o, , b, a, r, , b, a, z]

jshell> Arrays.asList(x.split(" "))

$6 ==> [foo, bar, baz]

上面的样例展现了临时变量($3、$5和$6),如果需要的话,它们可以用于后续表达式的计算。

jshell> import java.util.stream.*

jshell> $6.stream().filter(s -> s.startsWith("b")).collect(Collectors.toList())

$9 ==> [bar, baz]

在上例中,我们导入了 java.util.stream 包,这样的话,在Collectors类上进行tab键提示的时候,就能得到它的方法列表。

结论

JShell为Java带来了REPL,在经典的 LISP 机器上,这是一项非常有用的特性。它能够帮助开发人员调试代码片段,避免了完整的编译、运行和调试流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值