Stack Walking API (Java 9) cung cấp cơ chế linh hoạt duyệt và trích xuất thông tin từ call stack, cho phép lọc và truy cập frame theo cách lười (lazy). StackWalker là entry point. Stack trace đại diện call stack tại một thời điểm, mỗi element là một method invocation.
Ví dụ: In tất cả stack frame của thread hiện tại
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);
}
}
class Helper1 {
protected static void test1() {
Helper2.test2();
}
}
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());
}
}
}
Kết quả
Helper2 23 test2 Helper1 16 test1 StackWalkerTest 9 main
Giải thích
StackWalker.getInstance(): Tạo StackWalker mặc định (không RETAIN_CLASS_REFERENCE)..walk(s -> s.collect(Collectors.toList())): Duyệt toàn bộ frame, thu thập thành List.StackFramecung cấp:getClassName(),getMethodName(),getLineNumber(),getFileName(),getByteCodeIndex(),isNativeMethod().
So sánh với cách cũ
| Cách cũ | StackWalker API |
|---|---|
Thread.currentThread().getStackTrace() | StackWalker.getInstance().walk(...) |
Trả về mảng StackTraceElement[] (eager) | Stream StackFrame (lazy) |
| Chụp toàn bộ stack ngay | Chỉ materialize frame khi cần |
| Khó lọc/giới hạn | Dễ dàng filter, limit, skip, map |
| Không có class reference | Có Option.RETAIN_CLASS_REFERENCE để lấy Class<?> |
StackWalker API hiện đại, hiệu năng tốt hơn, phù hợp profiling, logging, diagnostic tools.