StackWalker API ให้สตรีมข้อมูลใน stack traces ระหว่างการรันโปรแกรม API นี้ต้องการ virtual machine จับ snapshot ของสแต็กทั้งหมดและคืน array ของ elements เพื่อการกรอง ต้อง skip, drop, และ limit stack frames ด้วยเมธอด walk() สามารถกรอง stack frame ตาม class เพื่อหา first matching frame และ all matching frames ด้วยเมธอด filter()
ตัวอย่าง: กรอง Stack Frame ด้วย 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)]
StackWalker Options
- RETAIN_CLASS_REFERENCE - เก็บ Class reference ไว้ ใช้ getDeclaringClass() ได้
- SHOW_HIDDEN_FRAMES - แสดง hidden frames (reflection, lambda, etc.)
- SHOW_REFLECT_FRAMES - แสดง reflection frames
เมธอดการกรองอื่นๆ
skip(n) - ข้าม n frames แรกlimit(n) - จำกัด n frames แรกfilter(predicate) - กรองตามเงื่อนไขmap(mapper) - แปลง frame เป็นค่าอื่นcollect(collector) - รวบรวมผลลัพธ์
StackWalker API ให้การเข้าถึง stack trace แบบ lazy และมีประสิทธิภาพสูง