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

วิธีกรอง stack frames ด้วย StackWalker API ใน Java 9

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 และมีประสิทธิภาพสูง