StackWalkerによる遅延スタック検査
完全なスタックトレースを実体化する代わりに、StackWalkerでスタックフレームを遅延検査する。
コード比較
✕ Materialized stack trace
StackTraceElement caller = Thread.currentThread()
.getStackTrace()[2];
String callerClass = caller.getClassName();
✓ Java 9+
String callerClass = StackWalker.getInstance()
.walk(frames -> frames.skip(1)
.findFirst()
.orElseThrow()
.getClassName());
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
遅延走査
操作に必要なフレームだけを走査します。
ストリームとの親和性
標準ストリーム操作でフィルタリングと選択を行えます。
設定可能
オプションにより、クラス参照、隠しフレーム、リフレクションフレームを扱えます。
旧来のアプローチ
Thread.getStackTrace()
モダンなアプローチ
StackWalker
JDKバージョン
9
難易度
中級
JDKサポート
StackWalkerによる遅延スタック検査
利用可能
JDK 9(2017年9月)以降、広く利用可能
仕組み
StackWalkerはスタックフレームの遅延ストリームと、保持されたクラス参照への設定可能なアクセスを提供します。スタックトレース配列全体を割り当てる代わりに、必要なフレームが見つかった時点で処理を停止できます。
関連ドキュメント
証明