エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

jshellまとめ

きっかけ

Java9のリリースまで半年をきったので、予習。
かなり前に触ったきり、使ってなかったので、予習を兼ねてやり直す。

環境準備

docker使ってJava9のイメージを使って試す。
使ったのは、java9-notebook

https://hub.docker.com/r/satoshun/java9-notebook/

起動したらexecボタンを押す。
もしくは、tryjshellっていうサービスがあるので、そちらを試す。 Java9をインストールする必要はないので、簡単に始められる。

tryjshell.org | Java 9's JShell

jshell

jshellとは、JavaのREPLツール。

REPL

  • R : Read 読み込み
  • E : Eval 評価
  • P : Print 出力
  • L : Loop readへ

javaのバージョン

java -versionで内容を確認

# java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+102-2016-01-21-001533.javare.4316.nc)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+102-2016-01-21-001533.javare.4316.nc, mixed mode)

jshell起動

etc/alternatives/jshell を実行。
そうすると下記の内容が出力され、jshellが起動する。

|  Welcome to JShell -- Version 9-ea
|  Type /help for help

お約束のHello World

まずは、Hello Worldの出力を確認してみる。
System.out.println("Hello World") を入力してエンターを押すと、下記の内容が出力される。

-> System.out.println("Hello World")
Hello World

ちなみに、タブ補完される。
System. を入力してタブ押下すると、下記の内容が出力される。

-> System.
Logger                 LoggerFinder           arraycopy(             class                  
clearProperty(         console()              currentTimeMillis()    err                    
exit(                  gc()                   getLogger(             getProperties()        
getProperty(           getSecurityManager()   getenv(                identityHashCode(      
in                     inheritedChannel()     lineSeparator()        load(                  
loadLibrary(           mapLibraryName(        nanoTime()             out                    
runFinalization()      runFinalizersOnExit(   setErr(                setIn(                 
setOut(                setProperties(         setProperty(           setSecurityManager(    

Javaをやっているとセミコロン(;)が必要なんじゃないかと思うかも知れないが、いらない。

変数を使ってのHello World

-> String str = "Hello World"
|  Added variable str of type String with initial value "Hello World"

-> System.out.println(str)
Hello World

でけた!

jshell終了方法

/exit を入力する。

-> /exit
|  Goodbye

コマンド

コマンド 説明
/list 入力したソースを一覧表示する
/edit 名前またはIDで参照されるソースを編集する(外部エディタの設定が必要)
/drop 名前またはIDで参照されるソースを削除する
/save ファイルにスニペット・ソースを保存する
/open ソースの入力としてファイルを開きます
/vars 宣言された変数およびその値をリストします
/methods 宣言されたメソッドおよびその署名をリストします
/types 宣言された型をリストします
/imports インポートされたアイテムをリストします
/exit jshellを終了する
/reset jshellの入力内容をリセットする
/reload リセットして関連する履歴をリプレイします
/classpath クラスパスにパスを追加します
/history 入力した内容の履歴
/help jshellに関する情報を取得します
/set jshell構成情報を設定します
/retain 後続のセッションに対してjshell構成情報を保持します
/? jshellに関する情報を取得します
/! 最後のスニペットを再実行します
/< id > IDでスニペットを再実行します
/-< n > n回前のスニペットを再実行します

コマンドを試す

随時追加予定

/list

まずは、準備として下記を入力

-> String a = "123"
-> System.out.println(a)

そしたら、/list を入力する。

-> /list

   1 : String a = "123";
   2 : System.out.println(a)

今まで入力した内容が出力される。
宣言した変数名とか処理を忘れてしまった場合は、これを使って確認するわけだね。

/edit

クラスや変数を、設定した外部エディターで編集できる。
外部エディターを設定してない場合、下記のようなエラーになる。

-> /edit
Exception in thread "main" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
    at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:205)
    at java.awt.Window.<init>(Window.java:535)
    at java.awt.Frame.<init>(Frame.java:422)
    at javax.swing.JFrame.<init>(JFrame.java:224)
    at jdk.internal.jshell.tool.EditPad.<init>(EditPad.java:55)
    at jdk.internal.jshell.tool.EditPad.edit(EditPad.java:118)
    at jdk.internal.jshell.tool.JShellTool.cmdEdit(JShellTool.java:1141)
    at jdk.internal.jshell.tool.JShellTool.lambda$new$23(JShellTool.java:732)
    at jdk.internal.jshell.tool.JShellTool.processCommand(JShellTool.java:550)
    at jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:492)
    at jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:287)
    at jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:260)
    at jdk.internal.jshell.tool.JShellTool.main(JShellTool.java:250)

使い方は、以下の通り。

/edit <name>

参考サイト

[Java9 新機能] jshell入門 - Qiita

JavaにREPLがやってくる - mike-neckのブログ

MacにJava9を入れてjshellを動かすまでのメモ - SHIBUYA 3%