stackwalker api 已在 java 9 中引入,它提供当前线程在任意给定点的堆栈跟踪快照时间并有方法走过它。与 thread::getstacktrace() 相比,使用 stackwalker 类的优点是可以过滤或跳过某些类并获取声明该类本身的实例并获取短堆栈跟踪或完整堆栈跟踪,而不是提取完整的堆栈跟踪本身。
在下面的示例中,我们可以使用 java.util.stream.stream.skip()
strong> 跳过堆栈帧的方法。
示例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中的某些类?的详细内容。