Một API tiêu chuẩn đã được cung cấp trong Java 9 bằng cách sử dụng java.lang.StackWalker lớp. Lớp này được thiết kế để hoạt động hiệu quả bằng cách cho phép truy cập lười biếng vào khung ngăn xếp. Một số tùy chọn khác cho phép theo dõi ngăn xếp bao gồm triển khai và / hoặc khung phản chiếu và nó có thể hữu ích cho mục đích gỡ lỗi. Ví dụ:chúng tôi thêm SHOW_REFLECT_FRAMES tùy chọn đối với phiên bản StackWalker khi tạo, để các khung cho các phương pháp phản chiếu cũng được in.
Trong ví dụ dưới đây, chúng ta có thể hiển thị các khung phản chiếu của StackFrame
Ví dụ
import java.lang.StackWalker.Option; import java.lang.StackWalker.StackFrame; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.stream.Collectors; public class ReflectionFrameTest { public static void main(String args[]) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Method test1Method = Test1.class.getDeclaredMethod("test1", (Class[]) null); test1Method.invoke(null, (Object[]) null); } } class Test1 { protected static void test1() { Test2.test2(); } } class Test2 { protected static void test2() { // show reflection methods List<StackFrame> stack = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES).walk((s) -> s.collect(Collectors.toList())); for(StackFrame frame : stack) { System.out.println(frame.getClassName() + " " + frame.getLineNumber() + " " + frame.getMethodName()); } } }
Đầu ra
Test2 22 test2 Test1 16 test1 jdk.internal.reflect.NativeMethodAccessorImpl -2 invoke0 jdk.internal.reflect.NativeMethodAccessorImpl 62 invoke jdk.internal.reflect.DelegatingMethodAccessorImpl 43 invoke java.lang.reflect.Method 564 invoke ReflectionFrameTest 11 main