如何在Java 9中跳过StackFrame中的某些类?

Java 9中引入了StackWalker API ,它提供了在任何给定时间点当前线程的堆栈跟踪的快照,并提供了遍历它的方法。与Thread ::相比,使用StackWalker 类的优点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)]

以上是 如何在Java 9中跳过StackFrame中的某些类? 的全部内容, 来源链接: utcz.com/z/317526.html

回到顶部