如何在 Java 9 中显示当前线程的所有堆栈帧?
堆栈遍历 API可以提供一种灵活的机制来遍历和从调用堆栈中提取信息,使我们能够以惰性方式筛选和访问帧。StackWalker 类是 Stack Walking API 的入口点。堆栈轨迹是在某一时间点上对调用堆栈的表示,其中每个元素表示一个方法调用。它包含从线程开始到生成它的那一点的所有调用。
在以下示例中,我们可以使用 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 class class Helper1 { protected static void test1() { Helper2.test2(); } } // Helper2 class class 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
广告