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

Làm thế nào để hiển thị tất cả các khung ngăn xếp của luồng hiện tại trong Java 9?


API đi bộ xếp chồng có thể cung cấp một cơ chế linh hoạt để duyệt và trích xuất thông tin từ ngăn xếp cuộc gọi cho phép chúng tôi lọc và truy cập các khung một cách lười biếng. StackWalker lớp là một điểm vào Stack Walking API. Dấu vết ngăn xếp là đại diện của địa điểm gọi k tại một thời điểm nhất định trong đó mỗi phần tử đại diện cho một phương pháp lời kêu gọi . Nó chứa tất cả các lệnh gọi từ khi bắt đầu một chuỗi cho đến khi nó được tạo ra.

Trong ví dụ dưới đây, chúng tôi có thể in / hiển thị tất cả các khung ngăn xếp của chuỗi hiện tại bằng cách sử dụng API StackWalker.

Ví dụ

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);
   }
}

// Helper1 class
class Helper1 {
   protected static void test1() {
      Helper2.test2();
   }
}

// Helper2 class
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());
      }
   }
}

Đầu ra

Helper2 23 test2
Helper1 16 test1
StackWalkerTest 9 main