歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> JavaOne 2016——觀眾得以一睹JShell的威力

JavaOne 2016——觀眾得以一睹JShell的威力

日期:2017/3/3 17:50:48   编辑:學習Linux

JavaOne 2016——觀眾得以一睹JShell的威力

JavaOne 2016——觀眾得以一睹JShell的威力


導讀在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是什麼?

JavaOne 2016——觀眾得以一睹JShell的威力JavaOne 2016——觀眾得以一睹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樣例

JavaOne 2016——觀眾得以一睹JShell的威力JavaOne 2016——觀眾得以一睹JShell的威力

在介紹Reinhold JavaOne上的樣例之前,我想要補充一句,如果你使用最新版本的Java 9 SDK並輸入"java –version"的話,那麼會發現現在的版本號字符串會有所變更,如下所示:

$ java -versionjava 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 introjshell>

如果你輸入一個像下面這樣的簡單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機器上,這是一項非常有用的特性。它能夠幫助開發人員調試代碼片段,避免了完整的編譯、運行和調試流程。

原文來自:http://www.linuxeden.com/html/news/20160927/168237.html

本文地址:http://www.linuxprobe.com/javaone-jshell-power.html


http://xxxxxx/Linuxjc/1184606.html TechArticle

Copyright © Linux教程網 All Rights Reserved