Java 9 thêm lớp StackWalker cung cấp API chuẩn truy cập stack của thread hiện tại. Phiên bản Java trước dùng Throwable::getStackTrace, Thread::getStackTrace, và SecurityManager::GetClassContext để lấy thread stack.
Phương thức Thread.getStackTrace() trả về mảng stack trace element đại diện cho stack dump của thread (StackTraceElement[]). Phần tử đầu mảng là đỉnh stack (gọi phương thức cuối cùng), phần tử cuối là đáy stack (gọi phương thức đầu tiên).
Cú pháp
public StackTraceElement[] getStackTrace()
Ví dụ
import java.lang.StackWalker.Option;
public class GetStackTraceTest {
public static void main(String args[]) {
GetStackTraceTest.testPrintCurrnentStackTrace();
GetStackTraceTest.testShowReflectFrames();
}
// get StackTrace using Thread
public static void testPrintCurrnentStackTrace() {
StackTraceElement[] stack = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stack) {
System.out.println(element);
}
}
// SHOW_REFLECT_FRAMES
public static void print(StackWalker stackWalker) {
stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n", stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName()));
}
public static void testShowReflectFrames() {
final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES);
print(stackWalker);
}
}
Kết quả
java.base/java.lang.Thread.getStackTrace(Thread.java:1654) GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10) GetStackTraceTest.main(GetStackTraceTest.java:5) 17| GetStackTraceTest -> print 25| GetStackTraceTest -> testShowReflectFrames 6| GetStackTraceTest -> main