Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách hiển thị tất cả stack frame của thread hiện tại trong Java 9

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.
  • StackFrame cung 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 ngayChỉ materialize frame khi cần
Khó lọc/giới hạnDễ dàng filter, limit, skip, map
Không có class referenceCó 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.