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

更新日期: 2020-04-24

164 次浏览

启动你的 职业生涯

通过完成课程认证

开始
广告