尚学堂 老师好!

上海:15201841284

广州:020-2989 6995

深圳:0755-23061965

武汉:027-8798 9193

西安:029-8822 8155

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

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

更多精彩内容以及学习资料,尚学堂论坛bbs.bjsxt.com免费下载。

借助 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)实现了代码替换功能。

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

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 |  Welcome to JShell -- Version 9-ea |  For an introduction type: /help intro   jshell> 

如果你输入一个如下所示的简单字符串声明,就能看到所有可调用的方法(包括重载方法):

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

更多精彩内容以及学习资料,尚学堂论坛bbs.bjsxt.com免费下载。

  • 北京校区
  • 西安校区
  • 山西校区
  • 武汉校区
  • 长沙校区
  • 深圳校区
  • 上海校区
  • 广州校区
  • 保定招生办
  • 黑龙江项目办

北京京南校区:北京亦庄经济开发区科创十四街6号院1号楼 赛蒂国际工业园
咨询电话:400-009-1906 / 010-56233821
面授课程: JavaEE+微服务+大数据     大数据+机器学习+平台架构     Python+数据分析+机器学习  人工智能+模式识别+强化学习   WEB前端+移动端+服务端渲染

地址:陕西省西安市高新区西安软件园西区创新信息大厦A座三层尚学堂

电话:029-88228155 / 18291433445

山西学区地址:山西省晋中市榆次区大学城大学生活广场万科商业A1座702

武汉学区地址:武汉市东湖高新区光谷金融港B22栋11楼
咨询电话:027-87989193

网址:http://www.cssxt.com/
咨询电话:0731-83072091

深圳校区地址:深圳市宝安区航城大道U8智造产业园U6栋3楼
咨询电话:0755-23061965 / 18898413781

上海尚学堂校区地址:上海市浦东新区城丰路650号
咨询电话:021-67690939

广州校区地址:广州市天河区车陂街道大岗路5号中侨广场2栋321室(四号线车陂站D出口,或brt车陂站)
咨询电话:18948349646

保定招生办公室

地址:河北省保定市竞秀区朝阳南大街777号鸿悦国际1101室

电话:15132423123

黑龙江项目办
地点:哈尔滨市松北区博文路青年部落孵化器1层
电话:15321415678
Copyright 2006-2021 北京尚学堂科技有限公司  京ICP备13018289号-19  京公网安备11010802015183  
网站维护:北京尚学堂科技有限公司昌平分公司