Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

手軽にJavaの実行結果が確認できるJava 9の新しいツール「JShell」

Java 9で「変わること」と、Javaのこれまで 第4回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/01/24 14:00

 前回は、Java 9における最も大きな変更であるモジュール機能(Project Jigsaw)について解説しました。今回は新たに追加されたツールである「JShell」(Project Kulla)を紹介します。JShellはJavaの仕様や動作などの変更とは違い、より広い利用者にJavaを使ってもらう、または、より便利にJavaを使ってもらうといった目的のために用意されたツールです。

目次

学習や動作確認に使用できるJShellとは

 「JShell」とは、Java 9で提供される新たなツールの1つです。JShellを使えば、コードをjavaコマンドでコンパイルし、その後、javaコマンドで実行するという手順を行わなくても、実行結果が確認できます。

 このような環境をREPL(Read-eval-print loop)と呼びます。JShellは、Java 9のSDKから標準で利用できるREPL環境です。

[Note]さまざまなREPL

 REPL環境について他の言語も含めて体験してみたい方は、さまざまな言語でREPL環境を提供しているWebサービス、「repl.it」を利用してみてください。

 これまでJavaを学習したい場合にはJava SEをインストールし、EclipseやNetBeans、またはIntelliJ IDEAなどのIDE環境をそろえるのが普通でした。他の言語での開発、特にスクリプト言語と比べると、たった1行のコードを実行するにも、実行までの手間がかかることが分かると思います。

 例えばJavaScriptなら、リスト1のコードを実行するだけで結果が確認できます。

リスト1 JavaScriptで"hello"という文字列を表示したい場合のコード例
console.log("hello");

 しかしJavaの場合は、リスト2の通り必ずmain文の中に処理を記述する必要があります。

リスト2 Javaで"hello"という文字列を表示したい場合のコード例
class Main {
  public static void main(String[] args) {
    System.out.println("hello");
  }
}

 この程度の違いであればいいですが、実際に学習が進むと、標準で提供されているAPIだけでなく、オープンソースなどで提供されているライブラリを使うようになります。実際の開発に近いレベルで学習するとなると他の環境に依存する割合が高いため、repl.itなどのサービスで対応することは難しくなるはずです。

 そこで、JavaはJShellというツールを標準で用意しました。JShellは学習目的に特化しているわけではなく、以下の用途で利用可能です。

  • Javaの学習目的
  • APIの動作確認や、記事やサイトなどのサンプルコードの動作確認
  • テスト

JShellの基本的な利用方法

 それでは、実際にJShellを使ってみましょう。jshellコマンドを実行すると、リスト3の通り表示されます。

リスト3 jshellコマンドを実行したときの実行結果例
$jshell
|  JShellへようこそ -- バージョン9
|  概要については、次を入力してください: /help intro

jshell>

 この状態は、すでにリスト4の(1)のmainメソッドの中にいるイメージです。ここから自分で好きなコードを記述していけばいいので、簡単に結果を確認できます。

 また、コードは順次実行していきます。その場で実行結果を表示でき、JShellという名前の通りShellコマンドを実行するように利用が可能です。

リスト4 jshellコマンドを実行した際のソースコードの関係のイメージ
class Main {
  public static void main(String[] args) {
    //  (1) ここにいるイメージ
  }
}

 それ以外にもJShell上でコードを確認する場合、これまでのJavaと同じコードを書く必要はなく、よりコードの確認がしやすいようになっています。

 その違いは以下のリスト5(Base64でのエンコード・デコードコード)を見るとわかります。

リスト5 Base64でのエンコード・デコードをするコードをJShellで実行したときの例
jshell> import java.util.Base64.*;
jshell> Base64.getEncoder();                // (1) 自動的に変数が定義される
$2 ==> java.util.Base64$Encoder@1ce92674
jshell> $2.encodeToString("hello world".getBytes());
$3 ==> "aGVsbG8gd29ybGQ="                   // (2) Stringオブジェクトの内容の表示
jshell> Base64.getDecoder();
$4 ==> java.util.Base64$Decoder@544fe44c
jshell> $4.decode($3.getBytes());
$5 ==> byte[11] { 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 }  // (3) byte[]型の表示
jshell> new String($5);
$6 ==> "hello world"
jshell> /exit  (4)終了
|  終了します

 通常のソースコードを書く場合と最も異なるのは、(1)のように変数を定義する必要はなく、自動的に${数値}のような変数が定義される点です。もちろん、自分で定義すればその変数名で定義が可能です。

 また、(2)や(3)のように、実行した際のオブジェクトの中身がわかりやすい形式で表示されます。そのためJShellでは、変数の内容を確認するためにSystem.out.printlnなどのメソッドを利用する必要はありません。このように逐次、実行状況やオブジェクトの状況が確認しやすくなっています。

 終了するときは(4)の通り/exitで終了します。

JShellでのコード記述をより便利するエディタ機能

 Javaのソースを記述する際は、テキストエディタではなくIDEを使うのが一般的でしょう。その理由の1つに、利用できるクラスやメソッドの自動補完機能やインラインヘルプ機能の存在があります。

 JShellでも同様に、タブキーを押すことでリスト6のように対象を表示してくれます。また、対象が1つのみの場合は自動的に残りの部分のコードも補完されます。さらに、メソッドの引数の説明なども表示することも可能です。

リスト6 JShell内でのコードヘルプ機能の実行例
jshell> Base64.[タブキー]
Decoder            Encoder            class              getDecoder()       getEncoder()       getMimeDecoder()   getMimeEncoder(    getUrlDecoder()    getUrlEncoder()
jshell> $4.[タブキー]
decode(       equals(       getClass()    hashCode()    notify()      notifyAll()   toString()    wait(         wrap(
jshell> Base64.getDecoder().decode([タブキー]
byte[] Base64.Decoder.decode(byte[] src)
Decodes all bytes from the input byte array using the Base64 encoding scheme, writing the
results into a newly-allocated output byte array.The returned byte array is of the length of
the resulting bytes.
// 以下省略

 なお、JShell内ではクラスを作成することなく、リスト7の通りメソッドも作成できます。作成したメソッドはJShell内でのグローバルなstaticメソッドとして定義されます。

リスト7 JShell内でのコードヘルプ機能の実行例
jshell> public String ts(Object obj){ return obj.toString(); }

 このような動作確認であれば、JShellのほうがIDEを用いるよりも簡単にできるはずです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2017年5月時点での登録メンバは52名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Java 9で「変わること」と、Javaのこれまで
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5