如何在 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)]
广告