コマンドの説明
続いて、JShellで利用可能なコマンドを紹介します。
コマンドとは、JShellを起動した後に指定できる"/(スラッシュ)"で始まる命令です。主に、JShell内で実行を助けるためのコマンドと、Javaの実行時に指定できるオプションと同様の意味を持つコマンドに分けられます。
すべてのコマンドやその説明は/helpコマンドで確認可能です。ここではよく利用するコマンドについて説明します。
/imports
現在インポートされている内容が表示できます。初期状態でインポートされているパッケージを変更したい場合には、後述するJShellを起動する際のオプションで可能です。
jshell> /imports | import java.io.* | import java.math.* | import java.net.* : 以下省略
/list [<name or id>|-all|-start]
今まで入力したコードの一覧を表示します。引数に何も指定しない場合には起動してからのコードがリスト9の通り表示されます。また、引数にname(クラス名や変数名など)もしくはid(/listコマンド等で表示される番号)を指定すると、その特定のコードを表示し、-startでは起動時に実行されたコードを、-allでは-startで表示する内容に加えてエラーとなった入力も含めて表示します。
jshell> /list
1 : import java.util.Base64.*;
2 : Base64.getEncoder();
3 : $2.encodeToString("hello world".getBytes());
4 : Base64.getDecoder();
5 : $4.decode($3.getBytes());
6 : new String($5);
/edit <name or id>
過去に入力したコードの内容を変更するコマンドです。このコマンドを実行すると図1のようなテキストエディタが開かれます。そこに入力したコードが表示されているので、そのコードを変更できます。
JShellではクラス定義などの複数行のコードをコピー&ペーストした場合、思うように動作しません。そこでclass A{}のように入力後このコマンドを使用し、テキストエディタにコピペして定義し直すといった使い方も可能です。
/<id>
指定したidのコードを再実行します。変数の値を変えて、再度実行する場合になどに便利なコマンドです。
/!
最後に実行したコードを再実行します。
/drop <name or id>
指定したコードを削除します。例えば変数を定義したコードを削除すると、その変数が削除されます。また、クラスを定義したコードを削除すると、そのクラスは未定義状態に戻ります。
/vars [<name or id>|-all|-start]
宣言済みの変数とその値を表示します。オプションを指定すれば特定の変数のみを表示することができます。変数名を忘れてしまった場合や、変数の中身を確認する際に利用します。
同様に、/typesでは宣言済みの型(クラス)の表示ができ、/methodsで宣言済みのメソッドの表示が行えます。
/open <file>
指定したファイルから読み込んでコードを実行します。
/save [-all|-history|-start] <file>
実行したコードを指定したファイルに保存します。ただし、$1や$2などの自動で作成される変数を利用した場合にはそのまま、その変数名でファイルに保存されます。したがって、再度、/openコマンドを使って実行する前に/resetコマンドを使って状態をリセットしてから実行しないと、想定とは異なる変数が利用されますのでご注意ください。
/env [-class-path <path>] [-module-path <path>] [-add-modules <modules>]
javaコマンドの引数と同様にクラスパスの指定や、モジュールパスなどの指定を行います。複数のjarファイルをクラスパスに指定する場合は、リスト10のように複数のファイルを指定します。必要になった時点で、追加のjarファイルなどを指定することはできません。/envコマンドを使って状態を変更すると、これまで実行した内容によっては依存しているコードにエラーが生じるため、以前の状態をクリアした上で再度-class-pathなどの設定を行う場合には、/resetコマンドを利用します。
/env -class-path commons-lang3-3.7.jar:gson-2.6.2.jar // 以下のように複数行に分けて記述することはできません /env -class-path commons-lang3-3.7.jar /env -class-path gson-2.6.2.jar
JShellを起動する際のオプション指定
また、JShellは起動時にリスト11のオプションを指定することで、利用者が使いやすいようにカスタマイズが可能です。例えば、クラスパスなどは起動時に指定ができます。また、importされているパッケージなども変更が可能です。
jshell [OPTIONS] [実行するコードを記述したファイルを指定]
「実行するコードを示したファイル」は複数指定が可能です。起動後に/openコマンドでファイルを指定する場合と同じ動作になります。したがって実行後にJShellを終了させたい場合には、ファイルの最後で/exitコマンドを実行してください。
よく利用するOPTIONSには、以下のものがあります。
--class-path <path>/--module-path <path>/--add-modules <module>(,<module>,,,)
これらの指定はjavaコマンドを起動する際のオプションと同様です。こちらの指定を使うことで、起動時にクラスパスやモジュールパスなどを指定できます。
--startup <file>
起動直後に自動的に実行するコードがある場合は、ここで指定します。毎回、事前準備のために同じようなコードを記述するケースがあると思います。それらのコードはこの指定を使って実行すると便利です。例えば、リスト12のように必要なクラスのimport指定やメソッドの定義などをしておくと、長いコードを記述する必要がなくなるのでより便利になります。
import java.util.*;
import java.io.*;
import java.math.*;
import java.net.*;
import java.util.concurrent.*;
import java.util.prefs.*;
import java.util.regex.*;
import org.apache.commons.lang3.*;
void printf(String format, Object... args) { System.out.printf(format, args); }
int strlen(String str){
return StringUtils.length(str);
}
String[] split(String str,String separator){
return StringUtils.split(str,separator);
}
