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

Làm thế nào để lấy dấu vết ngăn xếp bằng cách sử dụng luồng trong Java 9?

Java 9 đã thêm StackWalker lớp để cung cấp một API tiêu chuẩn để truy cập ngăn xếp luồng hiện tại. Trong các phiên bản java trước, chúng ta có thể sử dụng Throwable ::getStackTrace , Chủ đề ::getStackTrace SecurityManager ::GetClassContext đã cung cấp các phương thức để có được ngăn xếp luồng.

Thread.getStackTrace () phương thức sẽ trả về một mảng các phần tử theo dõi ngăn xếp đại diện cho kết xuất ngăn xếp của một luồng ( StackTraceElement [] ). Phần tử đầu tiên của một mảng đại diện cho phần trên cùng của ngăn xếp, nó có thể là lệnh gọi phương thức cuối cùng trong một chuỗi và phần tử cuối cùng của một mảng đại diện cho phần dưới cùng của ngăn xếp, nó có thể là lệnh gọi phương thức đầu tiên trong một chuỗi.

Cú pháp

public StackTraceElement[] getStackTrace()

Ví dụ

import java.lang.StackWalker.Option;

public class GetStackTraceTest {
   public static void main(String args[]) {
      GetStackTraceTest.testPrintCurrnentStackTrace();
      GetStackTraceTest.testShowReflectFrames();
   }
   // get StackTrace using Thread
   public static void testPrintCurrnentStackTrace() {
      StackTraceElement[] stack = Thread.currentThread().getStackTrace();
      for(StackTraceElement element : stack) {
         System.out.println(element);
      }
   }
   // SHOW_REFLECT_FRAMES
   public static void print(StackWalker stackWalker) {
      stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n",
stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName()));
   }

   public static void testShowReflectFrames() {
      final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES);
      print(stackWalker);
   }
}

Đầu ra

java.base/java.lang.Thread.getStackTrace(Thread.java:1654)
GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10)
GetStackTraceTest.main(GetStackTraceTest.java:5)
   17| GetStackTraceTest -> print
   25| GetStackTraceTest -> testShowReflectFrames
   6| GetStackTraceTest -> main