一文學會Java的互動式程式設計環境jshell

程式猿DD 發表於 2022-05-26
Java

什麼是互動式程式設計環境?重點詞互動,在這樣的程式設計環境中,你每輸入一行程式碼,環境都會給你一個反饋,這就是互動式的程式設計環境。這種程式設計環境並不太適合工程化的複雜性需求,但在一些快速驗證、簡單計算之類的場景下還是非常好用的。其實互動式程式設計環境在其他高階語言中很早就有了,而Java直到Java 9才正式推出了這樣的工具。

下面就來一起學習下,這個Java中的互動式程式設計環境JShell

JShell快速入門

本期視訊:7分鐘學會如何使用Java的互動式程式設計環境jshell

啟動JShell

開啟終端,然後執行命令:jshell,執行效果如下:

➜  ~ jshell
|  歡迎使用 JShell -- 版本 9
|  要大致瞭解該版本, 請鍵入: /help intro

jshell>

執行計算

在jshell中可以快速的執行計算操作並獲得結果,比如這樣:

jshell> 1+2
$1 ==> 3

定義變數

在jshell中也可以定義變數與函式,比如,你可以這樣定義變數,並進行計算:

jshell> int a=1, b=2;
a ==> 1
b ==> 2

jshell> int c = a + b
c ==> 3

定義函式

在jshell中也可以函式來封裝操作,比如下面就是一個定義求和函式並呼叫它的例子:

jshell> int sum(int a, int b){
   ...>     return a + b;
   ...> }
|  已建立 方法 sum(int,int)

jshell> int c = sum(1, 2)
c ==> 3

定義類

在jshell中,定義一些簡單的類,也是可以實現的,比如:

jshell> public class Calculate {
   ...>
   ...>     public int a;
   ...>     public int b;
   ...>
   ...>     public int sum() {
   ...>         return a + b;
   ...>     }
   ...> }
|  已建立 類 Calculate

jshell> Calculate c = new Calculate();
c ==> [email protected]

jshell> c.a = 1
$9 ==> 1

jshell> c.b = 2
$10 ==> 2

jshell> c.sum()
$11 ==> 3

當然了,這種場景其實就已經比較複雜了,這裡其實搭配Java 16中新增的record來實現的話,會簡單實用一些。

本文收錄在了我正在連載的《Java新特性專欄》,該系列該用電子書的方式編寫,如果想要沉浸式閱讀學習的話,可以訪問Web版本:https://www.didispace.com/jav...

https://www.didispace.com/java-features/

檢視命令:/help

關於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 [-all]
|      您鍵入的內容的歷史記錄
|  /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 工具的簡介
|  keys
|      類似 readline 的輸入編輯的說明
|  id
|      片段 ID 以及如何使用它們的說明
|  shortcuts
|      片段和命令輸入提示, 資訊訪問以及
|      自動程式碼生成的按鍵說明
|  context
|      /env /reload 和 /reset 的評估上下文選項的說明
|  rerun
|      重新評估以前輸入片段的方法的說明

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 [-all]
|      您鍵入的內容的歷史記錄
|  /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 工具的簡介
|  keys
|      類似 readline 的輸入編輯的說明
|  id
|      片段 ID 以及如何使用它們的說明
|  shortcuts
|      片段和命令輸入提示, 資訊訪問以及
|      自動程式碼生成的按鍵說明
|  context
|      /env /reload 和 /reset 的評估上下文選項的說明
|  rerun
|      重新評估以前輸入片段的方法的說明

檢視定義的函式:/methods

jshell> /methods
|    int sum(int,int)

檢視定義的變數:/vars

jshell> /vars
|    int $1 = 3
|    int b = 2
|    Calculate c = [email protected]
|    int $9 = 1
|    int $10 = 2
|    int $11 = 3
|    int $13 = 3

列出輸入源條目:/list

執行後,可以看到之前在jshell中輸入的內容清單:

jshell> /list

   1 : 1+2
   3 : int a=1, b=2;
   5 : int sum(int a, int b){
           return a + b;
       }
   7 : public class Calculate {

           public int a;
           public int b;

           public int sum() {
               return a + b;
           }
       }
   8 : Calculate c = new Calculate();
   9 : c.a = 1
  10 : c.b = 2
  11 : c.sum()
  12 : Map a = new HashMap();

左側的數字為條目id,可以利用該id,進行編輯和刪除操作

編輯源條目:/edit

上面通過/list列出了輸入的條目資訊,下面試試通過/edit編輯下,比如:

jshell> /edit 7

此時會彈出修改框:

一文學會Java的互動式程式設計環境jshell

修改完成後,點選accept即可

刪除源條目:/drop

/drop命令可以用來刪除某個源條目,比如我們可以用下面的命令刪除id為12的那行Map a = new HashMap();

jshell> /drop 12
|  已刪除 變數 a

可以看到,執行後,也給出了提示:定義的Map型別的a變數刪除了。

儲存檔案:/save

如果想把這次編輯的內容儲存下來,以便到其他環境執行,或者下次繼續使用的話,可以通過/save來儲存到檔案裡,比如這樣:

jshell> /save aaa.txt

開啟檔案:/open

當我們換了一個jshell環境後,可以通過開啟之前儲存的檔案來快速還原之前的執行內容,比如:

jshell> /open aaa.txt

重置jshell:/reset

當我們要換一個內容編寫的時候,需要清空之前執行的條目(清空/list的內容),這個時候就可以這樣來實現:

jshell> /reset
|  正在重置狀態。

檢視引入的包:/imports

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.*

檢視定義的類:/types

jshell> /types
|    class Calculate

退出jshell:/exit

jshell> /exit
| Goodbye 

好了,今天的分享就到這裡!如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!

另外,不要走開,關注我!持續更新Java新特性專欄

歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源