Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

จะกรองสแต็กเฟรมโดยใช้ StackWalker API ใน Java 9 ได้อย่างไร


StackWalker API จัดเตรียมสตรีมข้อมูลในการติดตามสแต็กระหว่างการทำงานของโปรแกรม API นี้ต้องการ เครื่องเสมือน เพื่อจับภาพสแน็ปช็อตของสแตกทั้งหมดและส่งคืนอาร์เรย์ขององค์ประกอบเพื่อการกรอง เราจำเป็นต้องข้าม วาง และจำกัดเฟรมสแต็กโดยใช้ walk() กระบวนการ. นอกจากนี้เรายังสามารถกรองสแต็กเฟรมตามคลาสเพื่อรับเฟรมแรกที่ตรงกัน และเฟรมที่ตรงกันทั้งหมดโดยใช้ ตัวกรอง() วิธีการ

ในตัวอย่างด้านล่าง เราสามารถกรองสแต็กเฟรมโดยใช้ StackWalker API

ตัวอย่าง

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

ผลลัพธ์

--- 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)]