JDK9 學習之二 - Jshell(java 函數變成交互式 shell)

  1. jshell介紹

誰說原生java不能函數式編成!

JShell(JAVA Shell tool)是用來學習java語言和代碼設計的一個交互式工具。JShell是一個Read-Evaluate-Print Loop (REPL)閱讀-鍵入-打印-循環系統(函數式編成),他可以進行代碼聲明、輸入語句、輸入表達式 然后直接顯示結果。 然后這是一個命令行工具。

  1. 為什么使用Jshell

使用Jshell 你可以對程序過程中任意對象隨時查看打印結果,而且可以根據實際情況立即作出調整。

寫一個java 程序一般涉及到下面幾個步驟:

1. 寫一個完整的程序
2. 編譯&修改編譯錯誤
3. 運行程序
4. 看下哪里錯了
5. 修改代碼
6. 然后循環1->5 直到全部OK

Jshell可以實驗你的代碼還可以探索性的開發你的程序。你可以隨意編寫代碼,提煉出一個精良方法,也可以在jshell session里邊試用一些不熟悉的API。
Jshell當然不能替代IDE啦,但是你可以先把代碼在jshell里邊試驗成功以后(因為這樣就不用重復上面那個重復編譯的循環)然后就可以粘貼到你的IDE里邊去用了。

  1. Jshell的啟動和停止

Jshell 包含在JDK9里邊,所以必須要安裝JDK9。進入命令行(windows下是CMD),如果你沒有將$JAVA/bin 加入到系統PATH中,那么你只能進入到$JAVA_HOME/bin 使用./jshell進行啟動了

  1. Jshell啟動兩種模式

  • 正常模式
% jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro
#這里已經進入jshell了。
jshell>
  • 詳情模式(-v)

詳情模式是方便你看到例子和教程同步,也就是可以很方便得到引導和錯誤反饋。當你已經很熟悉這個工具了,那你就可以嘗試使用其他正常的或者間接模式(其他模式)
啟動詳情模式用 -v 選項:

% jshell -v
To exit JShell, enter /exit:

jshell> /exit
|  Goodbye
  1. 完整例子(功能演示)

leombp:~ Leo$ jshell -v
jshell> /help intro                 #查看系統大概的幫助
|  
|  intro
|  
|  使用 jshell 工具可以執行 Java 代碼, 從而立即獲取結果。
|  您可以輸入 Java 定義 (變量, 方法, 類, 等等), 例如:  int x = 8
|  或 Java 表達式, 例如:  x + x
|  或 Java 語句或導入。
|  這些小塊的 Java 代碼稱為 '片段'。
|  
|  這些 jshell 命令還可以讓您了解和
|  控制您正在執行的操作, 例如:  /list
|  
|  有關命令的列表, 請執行: /help

jshell> test                        # 測試下詳細模式的錯誤日志
|  錯誤:
|  找不到符號
|    符號:   變量 test
|    位置: 類 
|  test
|  ^--^

jshell> 1+1                         #可以很方便進行數字簡單計算
$1 ==> 2
|  已創建暫存變量 $1 : int

jshell> int a=10                    #正常定義變量
a ==> 10
|  已創建 變量 a : int
        
jshell> String twice(String s){     #函數式定義方法
   ...> return s + s;
   ...> }
|  已創建 方法 twice(String)

jshell> twice(                      #調用方法,這里類似Linux 按tab鍵可以想IDE一樣進行提示。
twice(   

jshell> twice("I Love This Game. ")                #調用成功
$4 ==> "I Love This Game. I Love This Game. "
|  已創建暫存變量 $4 : String

jshell> $4                         #返回系統自動聲明一個變量$4
$4 ==> "I Love This Game. I Love This Game. "
|  $4 的值: String

jshell> int divide(int x,int y){   #定義一個方法進行異常測試
   ...> return x /y ;
   ...> }
|  已創建 方法 divide(int,int)

jshell> dived                      #按tab進行提示
jshell> divide(10,0)               #異常
|  java.lang.ArithmeticException thrown: / by zero
|        at divide (#6:2)
|        at (#7:1)

jshell> /list                      #查看用戶定義

   1 : 1+1
   2 : int a=10;
   3 : String twice(String s){
       return s + s;
       }
   4 : twice("I Love This Game. ")
   5 : $4
   6 : int divide(int x,int y){
       return x /y ;
       }
   7 : divide(10,0)

jshell> "str".                     #測試下tab對對象的自動提示
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(                  


#測試自動導入
#Shift + Tab + i后出現意外的字符。
#Mac下是 `tab + i` 進行自動導入。
jshell> new JFrame
0: 不執行任何操作
1: import: javax.swing.JFrame
選項:                                    #我輸入了 1
Imported: javax.swing.JFrame

jshell> new JFrame

jshell> /exit                            #退出命令
|  再見


參考:
Java Platform, Standard Edition Tools Reference

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,115評論 25 708
  • ~(???????)~(???????)~(???????)~ 【安安每日閱讀分享】 2018-02-01-Thu...
    安安Ro7cie閱讀 263評論 0 0
  • 來往 來往 來來又往往 人生本就是一場來往 來的是朋友 去的是過客 一輩子,一場情 孑孑然一身 沖沖然一走 不后悔...
    御姐姐不是人生閱讀 239評論 4 7
  • #不給別人添麻煩,是不是一種美德#這是今晚奇葩說的題目 最后康永哥和羅振宇的那段很讓人值得思考。可以說沒有了別人,...
    相信那個相信你的我閱讀 337評論 0 1
  • 顏陵作為丞相之子,一直都是夜宸惜得力的臣子手下,只要是夜宸惜想要的東西,即使遠在天邊,顏陵也會給他找到,顏陵說過“...
    東樂雙子年華似水閱讀 383評論 0 2