如何在 Java 9 中跳過 StackFrame 中的某些類?
StackWalker API 已在 Java 9 中引入, 它提供當前執行緒在任何給定時間點的堆疊跟蹤的快照,並且有方法來遍歷它。使用 StackWalker 類相對於 Thread::getStackTrace() 的優點是過濾或跳過某些類,並且獲取宣告類的例項本身並獲取短堆疊跟蹤或完整堆疊跟蹤,而不是提取完整的堆疊跟蹤本身。
在下面的示例中,我們可以使用 java.util.stream.Stream.skip() 方法跳過棧幀。
示例
import java.lang.StackWalker.*;
import java.util.Optional;
import java.util.List;
import java.util.stream.Collectors;
import java.lang.StackWalker.StackFrame;
public class StackWalkerSkipTest {
public static void main(String args[]) {
new StackWalkerSkipTest().stackWalk();
}
private class StackWalker4 {
public void stackWalk4() {
List<StackFrame> framesAfterSkip = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk((s) ->
s.skip(2).collect(Collectors.toList()));
System.out.println("Frames after skip : \n" + framesAfterSkip.toString());
}
}
public void stackWalk() {
new StackWalker1().stackWalk1();
}
private class StackWalker1 {
public void stackWalk1() {
new StackWalker2().stackWalk2();
}
}
private class StackWalker2 {
public void stackWalk2() {
new StackWalker3().stackWalk3();
}
}
private class StackWalker3 {
public void stackWalk3() {
new StackWalker4().stackWalk4();
}
}
}輸出
Frames after skip : [StackWalkerSkipTest$StackWalker2.stackWalk2(StackWalkerSkipTest.java:29), StackWalkerSkipTest$StackWalker1.stackWalk1(StackWalkerSkipTest.java:24), StackWalkerSkipTest.stackWalk(StackWalkerSkipTest.java:19), StackWalkerSkipTest.main(StackWalkerSkipTest.java:9)]
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP