Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のJShellでデバッグを行う方法

JShellは、クラス内にコードを記述しなくてもコードスニペットをそのまま実行できるREPLツールです。Javaの宣言ステートメントを手軽に評価でき、コードの一部をテストするためにわざわざmain()メソッドを作成する必要がないのが大きな特徴です。

JShellには「/debug」コマンドが用意されており、これを実行するとJShell内部の実装に関するデバッグ情報を表示できます。コマンドを入力した時点でデバッグモードが有効になり、その後に入力したコード(単純な足し算や文字列の代入など)がどのようにコンパイル・評価されているかが詳細に出力されます。

例1:数値演算のデバッグ出力

jshell> /debug
| Debugging on

jshell> 5+3
Compiling: 5+3
Kind: EXPRESSION_STATEMENT -- 5 + 3;
compileAndLoad [Unit($1)]
++setCompilationInfo() Snippet:VariableKey($1)#11-5+3
package REPL;
import java.io.*;import java.math.*;import java.net.*;import java.nio.file.*;import java.util.*;
import java.util.concurrent.*;import java.util.function.*;import java.util.prefs.*;
import java.util.regex.*;import java.util.stream.*;class $JShell
$11 {
public static
int $1;
public static Object do_it$() throws Throwable {
return $1 = 5+3;
}
}

-- diags: []
setStatus() Snippet:VariableKey($1)#11-5+3 - status: VALID
compileAndLoad ins = [Unit($1)] -- legit = [Unit($1)]
Compiler generating class REPL.$JShell$11
compileAndLoad [Unit($1)] -- deps: [] success: true
recordCompilation: Snippet:VariableKey($1)#11-5+3 -- status VALID, unresolved []

$1 ==> 8

例2:変数宣言のデバッグ出力

jshell> /debug
| Debugging on

jshell> String s = "Adithya"
Compiling: String s = "Adithya";
Kind: VARIABLE -- String s = "Adithya"
compileAndLoad [Unit(s)]
++setCompilationInfo() Snippet:VariableKey(s)#12-String s = "Adithya";
package REPL;
import java.io.*;import java.math.*;import java.net.*;import java.nio.file.*;import java.util.*;
import java.util.concurrent.*;import java.util.function.*;import java.util.prefs.*;
import java.util.regex.*;import java.util.stream.*;import static REPL.$JShell$11.$1;
class $JShell$12 {
public static String s;
public static Object do_it$() throws Throwable {
String s_ =
"Adithya";
return s = s_;
}
}

-- diags: []
setStatus() Snippet:VariableKey(s)#12-String s = "Adithya"; - status: VALID
compileAndLoad ins = [Unit(s)] -- legit = [Unit(s)]
Compiler generating class REPL.$JShell$12
compileAndLoad [Unit(s)] -- deps: [] success: true
recordCompilation: Snippet:VariableKey(s)#12-String s = "Adithya"; -- status VALID, unresolved []
s ==> "Adithya"

出力結果を見ると、入力したスニペットが内部的にどのようなクラス($JShell$11など)として生成され、コンパイルされ、評価されているかが確認できます。スニペットの種類(EXPRESSION_STATEMENTVARIABLE)やコンパイル状態(VALID)といった情報も表示されるため、JShellの動作原理を理解したい場合や、思った通りに動かないときのトラブルシューティングに役立ちます。

デバッグモードをオフにする方法

デバッグモードを無効化したい場合は、同じセッション内でもう一度「/debug」コマンドを入力するだけで切り替えられます。

jshell> /debug
| Debugging off

このように、/debugコマンドはトグルスイッチとして機能し、入力するたびにデバッグモードのオン・オフが切り替わります。通常の利用では不要ですが、JShellの内部挙動を詳しく調べたい開発者にとって便利な機能です。

  1. Java 9のJShellでシステムプロパティを取得する方法【コード例付き】

    JShellは、REPL(Read-Evaluate-Print-Loop)と呼ばれる対話型ツールです。main()メソッドを持つクラスを作成しなくても、簡単なJavaの文を入力するとその場で評価され、結果がすぐに表示されます。起動も簡単で、コマンドラインプロンプトで「jshell」と入力するだけでOKです。 システムプロパティを取得するには、System.getProperty()メソッドとSystem.getProperties()メソッドを使用します。 まずは、Systemクラスのstaticメソッドであるproperty()を使って、特定のシステムプロパティの値をJShell上で表示

  2. Java 9でJavaFXを使ってJShellをプログラムから実装する方法

    JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として