天天看點

Java9-REPL新特性 ( JShell )

作者:會踢球的程式源
REPL ,全稱 Read Eval Print Loop ,中文 「 互動式解釋器 」,其實,就是一種代碼所見即所得的即時編譯器。 Java 9 引入了 REPL ,并将其指令為 「 JShell 」 ,這真是我們 Java 開發的福音,以後示範代碼的時候再也不用搬着一個 IDE 到處跑了。

對于我們 Java 開發者來說,應該是 Java 9 帶來的最大的個性吧。我們終于可以像 Python 、 Ruby 和 Node.js 那樣在 Shell 可見即可得的運作一些範例代碼了。

也就是說,使用 REPL,我們可以編寫和測試基于 Java 的邏輯,無需使用 javac 進行編譯,直接檢視計算結果

運作 JShell

打開指令行提示符 ( Window 7 / Window xp ) 或 PowerShell ( Window 8 / Window 10 ) 或終端 ( Linux / Mac OSX ) ,并輸入 jshell 進入 JShell。啟動過程有點緩慢

$ jshell
|  歡迎使用 JShell -- 版本 10.0.2
|  要大緻了解該版本, 請鍵入: /help intro

jshell>
複制代碼           

正如提示那樣,我們可以輸入 /help 來獲得一些幫助

注意: 千萬不要省略開頭的反斜杠 /
jshell> /help
|  鍵入 Java 語言表達式, 語句或聲明。
|  或者鍵入以下指令之一:
|  /list [<名稱或 id>|-all|-start]
|   列出您鍵入的源
|  /edit <名稱或 id>
|   編輯源條目
|  /drop <名稱或 id>
|   删除源條目
|  /save [-all|-history|-start] <檔案>
|   将片段源儲存到檔案
|  /open <file>
|   打開檔案作為源輸入
|  /vars [<名稱或 id>|-all|-start]
|   列出已聲明變量及其值
|  /methods [<名稱或 id>|-all|-start]
|   列出已聲明方法及其簽名
|  /types [<名稱或 id>|-all|-start]
|   列出類型聲明
|  /imports 
|   列出導入的項
|  /exit [<integer-expression-snippet>]
|   退出 jshell 工具
|  /env [-class-path <路徑>] [-module-path <路徑>] [-add-modules <子產品>] ...
|   檢視或更改評估上下文
|  /reset [-class-path <路徑>] [-module-path <路徑>] [-add-modules <子產品>]...
|   重置 jshell 工具
|  /reload [-restore] [-quiet] [-class-path <路徑>] [-module-path <路徑>]...
|   重置和重放相關曆史記錄 -- 目前曆史記錄或上一個曆史記錄 (-restore)
|  /history 
|   您鍵入的内容的曆史記錄
|  /help [<command>|<subject>]
|   擷取有關使用 jshell 工具的資訊
|  /set editor|start|feedback|mode|prompt|truncation|format ...
|   設定配置資訊
|  /? [<command>|<subject>]
|   擷取有關使用 jshell 工具的資訊
|  /! 
|   重新運作上一個片段 -- 請參閱 /help rerun
|  /<id> 
|   按 ID 或 ID 範圍重新運作片段 -- 參見 /help rerun
|  /-<n> 
|   重新運作以前的第 n 個片段 -- 請參閱 /help rerun
|  
|  有關詳細資訊, 請鍵入 '/help', 後跟
|  指令或主題的名稱。
|  例如 '/help /list' 或 '/help intro'。主題:
|  
|  intro
|   jshell 工具的簡介
|  id
|   片段 ID 以及如何使用它們的說明
|  shortcuts
|   片段和指令輸入提示, 資訊通路以及
|   自動代碼生成的按鍵說明
|  context
|   /env /reload 和 /reset 的評估上下文選項的說明
|  rerun
|   重新評估以前輸入片段的方法的說明

jshell>
複制代碼           

JShell 的中文化還是做的比較好的,提示都是引文,我們就不一一介紹了

如果要檢視某個具體的指令的幫助資訊,可以輸入 /help [command] 來獲得,比如 /help intro 擷取工具簡介

jshell> /help intro
|  
|                                   intro
|                                   =====
|  
|  使用 jshell 工具可以執行 Java 代碼,進而立即擷取結果。
|  您可以輸入 Java 定義(變量、方法、類等等),例如:int x = 8
|  或 Java 表達式,例如:x + x
|  或 Java 語句或導入。
|  這些小塊的 Java 代碼稱為“片段”。
|  
|  這些 jshell 工具指令還可以讓您了解和
|  控制您正在執行的操作,例如:/list
|  
|  有關指令的清單,請執行:/help
複制代碼           

檢視 JShell 預設導入哪些包

我們可以使用 /imports 指令檢視 JShell 預設導入了哪些包

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
複制代碼           

使用 JShell import 指令導入某個包或檔案

我們可以使用 import 指令導入某個類或包,就像我們代碼中使用的那樣

jshell> import java.lang.*

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
|    import java.lang.*
複制代碼           

使用 JShell 進行一些簡單的數學運算

JShell 預設支援一些簡單的數學運算符,例如

jshell> 6 * 8
$4 ==> 48

jshell> 12 / 3
$5 ==> 4

jshell> $4
$4 ==> 48

jshell> $4 * $5
$7 ==> 192

jshell>
複制代碼           

可以看到,JShell 會将每一此執行的結果儲存到一個以 $ 開始的變量中,而後面,我們就可以對這些變量進行引用

JShell 中預設的上下文

我麼可以在 JShell 中使用我們平時在 Java 中使用的類和方法來擷取目前的運作上下文

擷取目前的執行線程

jshell> Thread.currentThread()
$8 ==> Thread[main,5,main]
複制代碼           

擷取目前執行的方法名

jshell> Thread.currentThread().getStackTrace()[2].getMethodName()
$9 ==> "invoke0"
複制代碼           

擷取目前執行的類名

jshell> Thread.currentThread().getStackTrace()[2].getClassName();
$10 ==> "jdk.internal.reflect.NativeMethodAccessorImpl"
複制代碼           

在 JShell 中定義一些方法

因為内部方法和内部類的關系,我們還可以在 JShell 中定義一個方法

在一行内定義

jshell> int doubled(int i){ return i*2;}
|  已建立 方法 doubled(int)
複制代碼           

在多行定義

jshell> int add(int i,int j){
   ...> return i+j;
   ...> }
|  已建立 方法 add(int,int)
複制代碼           

多行定義一個方法要遵循一條準則,就是每個換行位置必須是大括号或者雙目運算符等表達式的内部換行才可以

我們還可以重寫之前定義的方法

jshell> int doubled(int i){ return i*2;}
|  已修改 方法 doubled(int)
複制代碼           

定義了方法之後,我們就可以調用這些方法了

jshell> doubled(8)
$15 ==> 16

jshell> add(4,13)
$16 ==> 17
複制代碼           

退出 JShell

如果要退出 JShell,隻能輸入 /exit 指令

jshell> /exit
|  再見
複制代碼           

輸入 exit 或按下 CTRL + C 鍵是沒有任何效果的

jshell> exit
|  錯誤:
|  找不到符号
|    符号:   變量 exit
|    位置: 類 
|  exit
|  ^--^

jshell> 

jshell> 

jshell>           

原文連結:https://juejin.cn/post/7219621949776740411