Java9特性預覽——Jshell

##轉載請標明出處 http://coderknock.com ##什麼是JShell?java

JShell/Kulla項目是第一個官方的Java REPL (Read-Eval-Print-Loop的縮寫,即交互式編程環境),是一種命令行工具。它容許你無需編寫類或者方法來執行Java語句。它與Python的解釋器或其它本地支持REPL的JVM語言,如Scala和Groovy相似。在Java 9即將到來的的特性中,這絕對是更有趣的特性之一。shell

##JShell的使用 ###命令行中直接使用 下載安裝OpenJDK9,而後咱們就能夠在安裝目錄的bin文件夾下看到 jshell.exe ,若是你配置好了環境變量,那麼就能夠在命令行中使用了。編程

Jshell ####咱們來看下Jshell能夠有什麼設置選項: Jshell選項 ####/list:用於查看你以前輸入的語句的信息 /list命令 ####/vars:用於查看你以前輸入的變量,若是你只是輸入了一個表達式,Jshell會將計算結果保存爲一個變量 /varsapp

咱們並無聲明$1變量,可是Jshell默認將表達式的結果轉爲變量進行了存儲,因此咱們能夠直接使用改變量: 沒有聲明$1 ####/save:存儲以前的輸入 咱們執行: /save 會將文件存儲到你的用戶文件目錄下(你也能夠指定完整的路徑) 咱們來看看存儲的文件的內容:模塊化

1+1
1+1
2+2
$1
System.out.print($1)

其實就是簡單將你的輸入進行了保存 ####/reset:重置,會清楚你以前輸入的內容 /reset ####/open:打開一個文件並執行其中內容 /open ####/methods:獲取聲明的或者使用到靜態方法 /methods工具

/methods詳解 ####/types:顯示接口、類、枚舉等信息 /types ####/imports:獲取導入的包 /importsoop

上面的包都是默認導入的包這樣咱們就能直接使用這些包中的類而無需本身聲明 直接使用List ####/exit:退出Jshell /exit ####/reload:重置後從新加載以前的內容 /reload ####/classpath <path>:這個用於你使用本身聲明的類的時候能夠將目錄添加到classpath進行引用 ####/history:查看以前全部輸入的命令 /history ####/retain editor|start|feedback|mode 用於保存配置信息方便 別的環境中/set editor|start|feedback|mode來得到樣的配置 ####/id:從新執行某個id的操做 /id ####/-n:從新運行前面的第 n 個片斷 /-n ###在代碼中的使用 JDK9將Jshell相關API封裝爲模塊(模塊相關知識能夠查看模塊化簡單教程)方便使用。下面咱們經過代碼來學習一下相關的API:學習

package com.coderknock;
import java.io.ByteArrayInputStream;
import java.io.Console;
import java.util.List;
import jdk.jshell.*;
import jdk.jshell.Snippet.Status;
/**
 * 拿客
 * www.coderknock.com
 * QQ羣:213732117
 * 建立時間:2016年06月29日
 * 描述:JShell
 */
public class JshellMain {
	public static void main(String[] args) {
         Console console = System.console();
		 //建立一個Jshell環境,以後會自動進行關閉
         try (JShell js = JShell.create()) {
			 //循環監聽輸出
             do {
                 System.out.print("請輸入一些Java代碼: ");
                 String input = console.readLine();
                 if (input == null) {
                     break;
                 }
				 //將輸入的指令轉化爲SnippetEvent對象
                 List<SnippetEvent> events = js.eval(input);
                 for (SnippetEvent e : events) {
                     StringBuilder sb = new StringBuilder();
                     if (e.causeSnippet() == null) {
                         //  咱們有一個片斷建立的事件
                         switch (e.status()) {//根據代碼片斷的執行進行輸出
                             case VALID:
                                 sb.append("Successful ");
                                 break;
                             case RECOVERABLE_DEFINED:
                                 sb.append("With unresolved references ");
                                 break;
                             case RECOVERABLE_NOT_DEFINED:
                                 sb.append("Possibly reparable, failed  ");
                                 break;
                             case REJECTED:
                                 sb.append("Failed ");
                                 break;
                         }
                         if (e.previousStatus() == Status.NONEXISTENT) {
                             sb.append("addition");
                         } else {
                             sb.append("modification");
                         }
                         sb.append(" of ");
                         sb.append(e.snippet().source());
                         System.out.println(sb);
                         if (e.value() != null) {
                             System.out.printf("Value is: %s\n", e.value());
                         }
                         System.out.flush();
                     }
                 }
             } while (true);
         }
         System.out.println("\nGoodbye");
     }
}

進行編譯javac JshellMain.java -encoding UTF-8 運行結果: 運行 當輸入錯誤的java代碼時: 輸入錯誤 執行for循環等: for循環ui

相關文章
相關標籤/搜索