JShellツールはJava 9の内部でどのように動作するのか?仕組みを徹底解説
JShellとは?Java 9がもたらす新しい開発環境
JShellはJava 9で導入されたツールで、Java言語の機能や豊富な標準ライブラリを素早く探索・発見・実験できる、高速かつ使いやすい環境を提供します。いわゆるREPL(Read-Eval-Print Loop:読み込み・評価・表示のループ)として動作し、完全なプログラムを作成しなくても、1行ずつコードを実行して結果を即座に確認できるのが大きな特徴です。
内部の処理フロー:JLineからJVMまで
コードがJShellコンソールに入力されると、まずJLineというJavaライブラリによって処理されます。JLineは、コンソール上の入力を取得(キャプチャ)するためのライブラリです。入力が完了したコードは、次にJShellパーサーによって解析され、それがメソッドなのか変数なのかといった種類が判定されます。
JShellパーサーがクラスでラップする際のルール
JShellパーサーは、入力されたコードを内部的に1つのクラスへラップします。このとき、以下のルールが適用されます。
- すべてのimport文は、このクラスの先頭に配置される。
- 変数、メソッド、クラス宣言は、このクラスのstaticメンバーとして扱われる。
- 式や宣言は、このクラス内のメソッドでラップされる。
この段階を経て生成されたソースコードは、Javaコンパイラによって解析・コンパイルされ、バイトコードへと変換されます。その後、バイトコードは実行中のJVMプロセスへ送られ、ロードされて実行されるという流れです。
JShellの起動方法
以下のコードスニペットのように、コマンドラインプロンプトで「jshell」と入力するだけで、JShellツールを起動できます。
C:\Users\User>jshell
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
jshell>
JShellが起動すると、入力待ちのコマンドプロンプトが表示されます。ここで入力できるものには、大きく分けて2種類あります。ひとつは「/」で始まるJShell内部コマンド、もうひとつは通常のJavaコードです。
内部コマンドとJavaコードの実行例
以下のコードスニペットでは、「/list」のような内部コマンドと、System.out.println()のようなJavaコードの両方を実行しています。
jshell> System.out.println("Tutorialspoint")
Tutorialspoint
jshell> /list
1 : System.out.println("Tutorialspoint")このように、JShellは入力されたコードをリアルタイムで解析・コンパイル・実行し、その結果をすぐにフィードバックしてくれるため、Javaの学習やAPIの動作確認、プロトタイプ作成に非常に便利なツールです。
-
Java 9のJShellでシステムプロパティを取得する方法【コード例付き】
JShellは、REPL(Read-Evaluate-Print-Loop)と呼ばれる対話型ツールです。main()メソッドを持つクラスを作成しなくても、簡単なJavaの文を入力するとその場で評価され、結果がすぐに表示されます。起動も簡単で、コマンドラインプロンプトで「jshell」と入力するだけでOKです。 システムプロパティを取得するには、System.getProperty()メソッドとSystem.getProperties()メソッドを使用します。 まずは、Systemクラスのstaticメソッドであるproperty()を使って、特定のシステムプロパティの値をJShell上で表示
-
Java 9でJavaFXを使ってJShellをプログラムから実装する方法
JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として