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

Làm cách nào để lọc các khung ngăn xếp bằng cách sử dụng API StackWalker trong Java 9?


StackWalker API cung cấp một luồng thông tin trong các dấu vết ngăn xếp trong quá trình thực thi một chương trình. API này yêu cầu máy ảo để chụp nhanh toàn bộ ngăn xếp và trả về một mảng các phần tử cho mục đích lọc. Chúng tôi cần bỏ qua, thả và giới hạn khung ngăn xếp bằng cách sử dụng walk () phương pháp. Chúng tôi cũng có thể lọc khung ngăn xếp theo lớp để lấy khung phù hợp đầu tiên và tất cả các khung phù hợp bằng cách sử dụng bộ lọc () phương pháp.

Trong ví dụ dưới đây, chúng ta có thể lọc khung ngăn xếp bằng cách sử dụng API StackWalker.

Ví dụ

import java.lang.StackWalker.StackFrame;
import java.util.*;
import java.util.stream.*;

public class StackWalkerFilterTest {
   public static void main(String args[]) {
      final List<Class> filterClasses = new ArrayList<>();
      filterClasses.add(StackWalkerFilterTest.class);

      System.out.println("--- filter Frame by Class >> get first matching frame ---");
      Optional<StackFrame> frameByClass = findFrameByClass(filterClasses);
      System.out.println(frameByClass.toString());

      System.out.println("--- filter Frame by Class >> get all matching frames ---");
      List<StackFrame> framesByClass = findAllFramesByClass(filterClasses);
      System.out.println(framesByClass);
   }
   private static Optional<StackFrame> findFrameByClass(List<Class> filterClasses) {
      return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
.walk(s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).findFirst());
   }
   private static List<StackFrame> findAllFramesByClass(List<Class> filterClasses) {
      return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(
s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).collect(Collectors.toList()));
   }
}

Đầu ra

--- filter Frame by Class >> get first matching frame ---
Optional[StackWalkerTest.findFrameByClass(StackWalkerTest.java:20)]
--- filter Frame by Class >> get all matching frames ---
[StackWalkerTest.findAllFramesByClass(StackWalkerTest.java:23), StackWalkerTest2.main(StackWalkerTest.java:15)]