Computer >> Máy Tính >  >> Lập trình >> Java

Làm thế nào để hiển thị các khung phản chiếu của StackFrame trong Java 9?


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