パッケージ jdk.jshell
 JShellは中央クラスです。 JShellのインスタンスは評価ステートを保持します。評価ステートは、ソース・スニペットの現在のセットと、生成された実行ステートの両方です。 
 
 各ソース・スニペットは、Snippetのサブクラスのインスタンスで表されます。 たとえば、文はStatementSnippetのインスタンスで表され、メソッド宣言はMethodSnippetのインスタンスで表されます。 スニペットは、JShell.eval(String)が1つ以上のコード・スニペットを含む入力で呼び出されたときに作成されます。 
 
 スニペットのコンパイル・ステータスの変更は、SnippetEventで報告されます。 スニペットのステータスには3つの主要な変更があります: evalで作成することができます。JShell.drop(jdk.jshell.Snippet)を使用してアクティブなソース状態から削除することができます。また、別のスニペットの状態変更の結果としてステータスを更新することもできます。 例えば: 与えられたjs、JShellのインスタンス、js.eval("int x = 5;")を実行すると、変数xがソース状態に追加され、xのVarSnippetの作成を記述するイベントが生成されます。 その後、js.eval("int timesx(int val) { return val * x; }")を実行すると、ソース状態にメソッドが追加され、timesxのMethodSnippetの作成を記述するイベントが生成されます。 varxがevalへの最初の呼び出しによって作成されたスニペットを保持し、js.drop(varx)を実行すると2つのイベントが生成されるものとします: 1つは変数スニペットのステータスをDROPPEDに変更するメソッド、もう1つはメソッド・スニペット(これで、xへの未解決の参照があります)を更新するメソッドです。 
 
もちろん、APIの一般的なアプリケーションでは、入力は固定ストリングではなく、ユーザーからの入力となります。 以下は、APIを使ってREPLを実装する方法の非常に簡単な例です。
 
     import java.io.ByteArrayInputStream;
     import java.io.Console;
     import java.util.List;
     import jdk.jshell.*;
     import jdk.jshell.Snippet.Status;
     class ExampleJShell {
         public static void main(String[] args) {
             Console console = System.console();
             try (JShell js = JShell.create()) {
                 do {
                     System.out.print("Enter some Java code: ");
                     String input = console.readLine();
                     if (input == null) {
                         break;
                     }
                     List<SnippetEvent> events = js.eval(input);
                     for (SnippetEvent e : events) {
                         StringBuilder sb = new StringBuilder();
                         if (e.causeSnippet == null) {
                             //  We have a snippet creation event
                             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");
         }
     }
 
 
 
 ステータス変更イベントに登録するには、JShell.onSnippetEvent(java.util.function.Consumer)を使用します。 これらのイベントはevalとdropによってのみ生成され、これらのメソッドの戻り値はその呼び出しによって生成されたイベントのリストです。 したがって、上記の例のように、イベントを登録することなくイベントを使用することができます。 
 
 この例を試してみると、セミコロンで文または変数宣言を終了できないことが単に失敗することがわかります。 未完成のエントリ(例えば、所望のマルチ・ライン法)も1行後に失敗します。 SourceCodeAnalysisのユーティリティは、それらのようなケースに対処するために、ソース境界と完全性分析を提供します。 SourceCodeAnalysisは、タブ補完で使用される可能性のある、入力の推奨補完も提供します。 
- 導入されたバージョン:
- 9
- 
インタフェースのサマリー インタフェース 説明 SourceCodeAnalysis.CompletionInfo analyzeCompletion(String input)の結果。SourceCodeAnalysis.Documentation 与えられたユーザー入力の継続候補者のための文書。SourceCodeAnalysis.SnippetWrapper Javaソースのスニペットを有効なトップレベルJavaソースにラップします。SourceCodeAnalysis.Suggestion 与えられたユーザー入力の継続候補。
- 
クラスのサマリー クラス 説明 DeclarationSnippet すべての宣言スニペットのグループ化: 変数宣言(VarSnippet)、メソッド宣言(MethodSnippet)、および型宣言(TypeDeclSnippet)。Diag スニペットの診断情報。ErroneousSnippet 有効なJavaプログラミング言語コードではないコードのスニペット。ExpressionSnippet 代入式または可変値式のスニペット。ImportSnippet インポート宣言のスニペット。JShell JShell評価状態エンジン。JShell.Builder JShellインスタンスのビルダー。MethodSnippet メソッド定義用のスニペット。PersistentSnippet 将来のコードに影響を与え続けるスニペットのグループ化。Snippet スニペットは、JShell.eval(java.lang.String)に渡されるJavaソース・コードのスニペットを表します。SnippetEvent スニペットへの変更の説明。SourceCodeAnalysis ソース・コード入力用の解析ユーティリティを提供します。SourceCodeAnalysis.QualifiedNames 可能な修飾名のリスト。StatementSnippet 文のスニペット。TypeDeclSnippet 型定義のスニペット(クラス、インタフェース、enum、または注釈インタフェースの定義)。VarSnippet 変数定義のスニペット。
- 
列挙型のサマリー 列挙型 説明 Snippet.Kind スニペットの一般的な種類について説明します。Snippet.Status スニペットの現在の状態を示します。Snippet.SubKind スニペットの詳細な種類。SourceCodeAnalysis.Completeness 与えられた入力の完全性を記述します。
- 
例外のサマリー Exception 説明 EvalException 実行中のクライアント内でスローされるスロー可能オブジェクトをラップします。JShellException JShellのスーパークラスは例外を生成しましたUnresolvedReferenceException RECOVERABLE_DEFINEDスニペットを実行しようとした際に例外が報告されました。