モジュール java.base
パッケージ java.lang

クラスStackWalker

java.lang.Object
java.lang.StackWalker

public final class StackWalker extends Object
スタック・ウォーカ。

walkメソッドは、現在のスレッドに対してStackFrameの順次ストリームを開き、指定された関数を適用してStackFrameストリームを調査します。 ストリームは、スタックが生成された実行ポイントを表す最上位のフレームから最下位のフレームまで、スタック・フレーム要素を順番にレポートします。 walkメソッドが戻ると、StackFrameストリームは閉じられます。 クローズしたストリームを再利用しようとすると、IllegalStateExceptionがスローされます。

スタック・ウォーカ・オプションは、StackWalkerによって取得されるスタック・フレーム情報を構成します。 デフォルトでは、クラス名とメソッド情報は収集されますが、Class referenceは収集されません。 メソッド情報は、DROP_METHOD_INFOオプションを使用して削除できます。 Classオブジェクトは、RETAIN_CLASS_REFERENCEオプションを使用してアクセスするために保持できます。 リフレクションAPIおよび実装クラスのスタック・フレームは、デフォルトではhiddenです。

StackWalkerはスレッド・セーフです。 複数のスレッドが単一のStackWalkerオブジェクトを共有して、独自のスタックを横断できます。 権限チェックは、リクエストするオプションに従って、StackWalkerの作成時に実行されます。 スタック・ウォーキング時にこれ以上の権限チェックは行われません。

APIのノート:

1. 最初の呼び出し元が既知の実装クラスのリストをフィルタリングして検索するには:

    StackWalker walker = StackWalker.getInstance(Set.of(Option.DROP_METHOD_INFO, Option.RETAIN_CLASS_REFERENCE));
    Optional<Class<?>> callerClass = walker.walk(s ->
            s.map(StackFrame::getDeclaringClass)
             .filter(Predicate.not(implClasses::contains))
             .findFirst());

2. 現在のスレッドの上位10スタック・フレームのスナップショットを作成するには、

    List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).toList());
特に明記しないかぎり、このStackWalkerクラスのコンストラクタまたはメソッドにnull引数を渡すと、NullPointerExceptionがスローされます。

導入されたバージョン:
9