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