如何在 Java9 中透過 StackWalker API 過濾堆疊幀?
StackWalker API 提供了在程式執行期間堆疊跟蹤中的資訊流。此 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 List<Class> filterClasses = new ArrayList<>();
filterClasses.add(StackWalkerFilterTest.class);
System.out.println("--- filter Frame by Class >> get first matching frame ---");
Optional<StackFrame> frameByClass = findFrameByClass(filterClasses);
System.out.println(frameByClass.toString());
System.out.println("--- filter Frame by Class >> get all matching frames ---");
List<StackFrame> framesByClass = findAllFramesByClass(filterClasses);
System.out.println(framesByClass);
}
private static Optional<StackFrame> findFrameByClass(List<Class> filterClasses) {
return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
.walk(s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).findFirst());
}
private static List<StackFrame> findAllFramesByClass(List<Class> filterClasses) {
return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(
s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).collect(Collectors.toList()));
}
}輸出
--- 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)]
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP