ホームページ  >  記事  >  Java  >  Java 9 で StackWalker API を使用してスタック フレームをフィルタリングするにはどうすればよいですか?

Java 9 で StackWalker API を使用してスタック フレームをフィルタリングするにはどうすればよいですか?

WBOY
WBOY転載
2023-09-14 18:25:02792ブラウズ

如何在Java 9中使用StackWalker API过滤堆栈帧?

StackWalkerAPI は、プログラム実行中のスタック トレースの情報フローを提供します。この API には、スタック全体のスナップショットをキャプチャし、フィルター処理のために要素の配列を返すために 仮想マシン が必要です。スタック フレームをスキップ、削除、制限するには、walk() メソッドを使用する必要があります。 filter() メソッドを使用してクラスごとにスタック フレームをフィルタリングし、最初に一致するフレームとすべての一致するフレームを取得することもできます。

以下の例では、StackWalker API を使用してスタック フレームをフィルタリングできます。

import java.lang.StackWalker.StackFrame;
import java.util.*;
import java.util.stream.*;

public class StackWalkerFilterTest {
   public static void main(String args[]) {
      final <strong>List<Class></strong> filterClasses = new ArrayList<>();
      filterClasses.add(StackWalkerFilterTest.class);

      System.out.println("--- filter Frame by Class >> get first matching frame ---");
      <strong>Optional<StackFrame></strong> frameByClass = findFrameByClass(filterClasses);
      System.out.println(frameByClass.toString());

      System.out.println("--- filter Frame by Class >> get all matching frames ---");
      <strong>List<StackFrame></strong> framesByClass = findAllFramesByClass(filterClasses);
      System.out.println(framesByClass);
   }
   private static Optional<StackFrame> findFrameByClass(List<Class> filterClasses) {
      return <strong>StackWalker.getInstance</strong>(StackWalker.Option.<strong>RETAIN_CLASS_REFERENCE</strong>)
.<strong>walk</strong>(s -> s.<strong>filter</strong>(f -> filterClasses.contains(f.getDeclaringClass())).<strong>findFirst()</strong>);
   }
   private static List<StackFrame> findAllFramesByClass(List<Class> filterClasses) {
      return StackWalker.getInstance(StackWalker.Option.<strong>RETAIN_CLASS_REFERENCE</strong>).<strong>walk</strong>(
s -> s.<strong>filter</strong>(f -> filterClasses.contains(f.getDeclaringClass())).<strong>collect</strong>(Collectors.toList()));
   }
}

出力

<strong>--- filter Frame by Class >> get first matching frame ---
Optional[StackWalkerTest.findFrameByClass(StackWalkerTest.java:20)]
--- filter Frame by Class >> get all matching frames ---
[StackWalkerTest.findAllFramesByClass(StackWalkerTest.java:23), StackWalkerTest2.main(StackWalkerTest.java:15)]</strong>

以上がJava 9 で StackWalker API を使用してスタック フレームをフィルタリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。