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