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

Khi nào nên dùng phương thức StackWalker.getCallerClass() trong Java 9?

Java 9 cung cấp StackWalker API – một cách hiệu quả để duyệt stack trace với truy cập lười (lazy access) và khả năng lọc. Đối tượng StackWalker cho phép duyệt và truy cập các frame stack. Lớp này chứa các phương thức hữu ích như walk(), forEach() và getCallerClass().

Phương thức getCallerClass()

Phương thức getCallerClass() trả về lớp gọi phương thức mà gọi phương thức này (caller của caller). Để lấy được instance của lớp gọi, cần tùy chọn RETAIN_CLASS_REFERENCE khi tạo instance StackWalker. Tùy chọn này giữ lại instance của tất cả các lớp được duyệt bởi StackWalker.

Cú pháp

public Class<?> getCallerClass()

Ví dụ

import java.lang.StackWalker.Option;

public class StackWalkerTest {
    public static void main(String args[]) {
        StackWalkerTest1.test1();
    }
}

class StackWalkerTest1 {
    protected static void test1() {
        StackWalkerTest2.test2();
    }
}

class StackWalkerTest2 {
    protected static void test2() {
        System.out.println(StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass());
    }
}

Kết quả

class StackWalkerTest1

Giải thích: Trong chuỗi gọi main → test1 → test2, phương thức getCallerClass() trong test2 trả về StackWalkerTest1 – lớp gọi trực tiếp test2. Nếu không có Option.RETAIN_CLASS_REFERENCE, phương thức sẽ ném UnsupportedOperationException.

Khi nào nên sử dụng?

  • Cần xác định lớp gọi (caller class) cho logging, bảo mật hoặc debugging.
  • Thay thế cách cũ dùng new Throwable().getStackTrace() – kém hiệu năng hơn.
  • Khi cần truy cập metadata của lớp gọi (tên, package, annotations...).

Lưu ý: Chỉ dùng khi thực sự cần thiết do chi phí hiệu năng của StackWalker.