Heim  >  Artikel  >  Java  >  Wie filtere ich Stapelrahmen mithilfe der StackWalker-API in Java 9?

Wie filtere ich Stapelrahmen mithilfe der StackWalker-API in Java 9?

WBOY
WBOYnach vorne
2023-09-14 18:25:02746Durchsuche

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

StackWalkerAPI sorgt für den Informationsfluss in Stack-Traces während der Programmausführung. Diese API erfordert eine „virtuelle Maschine“, um einen Schnappschuss des gesamten Stapels zu erfassen und ein Array von Elementen zu Filterzwecken zurückzugeben. Wir müssen die Methode walk() verwenden, um Stapelrahmen zu überspringen, zu löschen und zu begrenzen. Wir können die Stack-Frames auch nach Klasse filtern, indem wir die Methode filter() verwenden, um den ersten passenden Frame sowie alle passenden Frames zu erhalten. Im folgenden Beispiel können wir die StackWalker-API verwenden, um Stapelrahmen zu filtern.

Beispiel

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()));
   }
}

Ausgabe

<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>

Das obige ist der detaillierte Inhalt vonWie filtere ich Stapelrahmen mithilfe der StackWalker-API in Java 9?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:JEP-Pakettool in JavaNächster Artikel:JEP-Pakettool in Java