如何在Java 9中显示当前线程的所有堆栈帧?

堆栈漫游API可以提供一种灵活的机制来遍历和从调用堆栈中提取信息,从而使我们能够以惰性方式过滤和访问帧。StackWalker 类是Stack Walking API的入口点。堆栈跟踪是一个的表示 呼叫STAC在特定点的时间,其中,每个元素表示第k方法 调用。它包含从线程开始到生成点的所有调用。

在下面的示例中,我们可以使用StackWalker API打印/显示当前线程的所有堆栈帧。

示例

import java.lang.StackWalker.StackFrame;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;

public class StackWalkerTest {
   public static void main(String args[]) throws Exception {
      Method test1Method = Helper1.class.getDeclaredMethod("test1", (Class[])null);
      test1Method.invoke(null, (Object[]) null);
   }
}// Helper1 classclass Helper1 {
   protected static void test1() {
      Helper2.test2();
   }
}// Helper2 classclass Helper2 {
   protected static void test2() {
      List<StackFrame> stack = StackWalker.getInstance().walk((s) -> s.collect(Collectors.toList()));
      for(StackFrame frame : stack) {
         System.out.println(frame.getClassName() + " " + frame.getLineNumber() + " " +    frame.getMethodName());
      }
   }
}

输出结果

Helper2 23 test2
Helper1 16 test1
StackWalkerTest 9 main