武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

JavaOne 2016——观众得以一睹 JShell 的威力

  • 2016-09-26
  • 本文字数:1950 字

    阅读完需:约 6 分钟

在 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 机器上,这是一项非常有用的特性。它能够帮助开发人员调试代码片段,避免了完整的编译、运行和调试流程。

查看英文原文 JavaOne 2016 – Audience Gets a Glimpse of the Power of JShell

2016-09-26 19:004049

评论

发布
暂无评论
发现更多内容

4. Validator校验器的五大核心组件,一个都不能少

YourBatman

Hibernate-Validator Bean Validation 数据校验

架构师入门感悟一

笑春风

一个大型的互联网应用系统使用了哪些技术手段

kawayi

第五周学习总结

alpha

极客大学架构师训练营

图解 | 一图摸清Android应用进程的启动

哈利迪

android

【建议收藏】10个适合程序员逛的在线社区

田维常

LeetCode题解:50. Pow(x, n),递归分治,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

微服务监控:SpringBoot-Micrometer-Influx

远鹏

监控 Influxdb springboot metrics

图解 | Android系统的启动

哈利迪

android

图解 | 一图摸清Android系统服务

哈利迪

android

食堂就餐卡系统设计

菜青虫

技术选型一第五周作业「架构师训练营第 1 期」

天天向善

第一周UML图

Geek_9527

极客大学 - 架构师训练营 第五周

9527

架构方法学习总结

Sandman

极客大学架构师训练营

1024,属于程序员的一天

白色蜗牛

编程 程序员 Java 分布式 1024

第五周作业

alpha

极客大学架构师训练营

正式“退休”的Flash,未来我们会怀念它吗?

脑极体

架构师2期week1作业

M.

架构师训练营W01作业

Geek_f06ede

极客大学架构师训练营

架构师训练营第五周作业——一致性哈希算法

文智

极客大学架构师训练营

架构师训练营 W01 总结

Geek_f06ede

极客大学架构师训练营

架构师训练营第五周总结

睡不着摇一摇

架构师一期

LeetCode题解:50. Pow(x, n),迭代分治,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

技术选型一第五周总结「架构师训练营第 1 期」

天天向善

SQL优化-分治思想

印哥爱学习

MySQL SQL优化

架构师训练营 - 第五周作业

一个节点

极客大学架构师训练营

架构师训练营 - 第五周总结

一个节点

极客大学架构师训练营

架构师训练营week1学习总结

花果山

极客大学架构师训练营

架构师训练营 -week05- 作业1

lucian

极客大学架构师训练营

周练习 5

何毅曦

JavaOne 2016——观众得以一睹JShell的威力_Java_Monica Beckwith_InfoQ精选文章