借助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 -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