パッケージjdk.jshell
JShell
は中央クラスです。 JShell
のインスタンスは、評価状態を保持します。これは、ソース・スニペットの現在のセットと生成した実行状態の両方です。
各ソース・スニペットは、Snippet
のサブクラスのインスタンスで表されます。 たとえば、文はStatementSnippet
のインスタンスで表され、メソッド宣言はMethodSnippet
のインスタンスで表されます。 スニペットは、コードのスニペットが1つ以上含まれる入力を使用してJShell.eval(String)
が呼び出されたときに作成されます。
スニペットのコンパイル・ステータスの変更は、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
-
クラス説明すべての宣言スニペットのグループ化: 変数宣言(
VarSnippet
)、メソッド宣言(MethodSnippet
)、および型宣言(TypeDeclSnippet
)。スニペットの診断情報。有効なJavaプログラミング言語コードではないコードのスニペット。実行中のクライアント内でスローされるスロー可能オブジェクトをラップします。代入式または変数値式のスニペット。インポート申告のスニペット。JShell評価状態エンジン。JShell
インスタンスのビルダー。ユーザーのスニペットでConsole
の機能を提供するインタフェース。JShellのスーパークラスは例外を生成しましたメソッド定義のスニペット。保持され、将来のコードに影響を与えるスニペットのグループ化。スニペットは、JShell.eval(java.lang.String)
に渡されるJavaソース・コードのスニペットを表します。一般的なスニペットについて説明します。スニペットの現在の状態を示します。スニペットの細かい種類。スニペットに対する変更の説明。ソース・コード入力の分析ユーティリティを提供します。色付けの導出に使用できるスパン属性。指定された入力の完全性を示します。analyzeCompletion(String input)
の結果。指定されたユーザーの入力を継続するための候補者のドキュメント。スニペット内のスパンに色付けするために使用できる属性を割り当てます。使用可能な修飾名のリスト。Javaソースのスニペットを有効な最上位Javaソースにラップします。指定されたユーザーの入力の継続候補。文のスニペット。型定義のスニペット(クラス、インタフェース、列挙または注釈インタフェースの定義)。RECOVERABLE_DEFINED
スニペットの実行中に例外が報告されました。変数定義のスニペット。