StackWalker API
StackWalker API ใน Java 9 ให้การเข้าถึง stack trace information แบบ lazy และ filterable มีประสิทธิภาพกว่า StackTraceElement แบบเดิม
คลาสหลัก 3 ตัว
- StackWalker - คลาสหลัก ใช้
forEach(),getCallerClass(),walk() - StackWalker.StackFrame - nested class แทน method invocation มี
getDeclaringClass(),getLineNumber()ฯลฯ - StackWalker.Option - nested class กำหนด options ตอนสร้าง instance ด้วย
StackWalker.getInstance()
ตัวอย่างการใช้งาน
import java.util.List;
import java.util.stream.Collectors;
public class StackWalkingTest {
public static void main(String args[]) {
final List<StackWalker.StackFrame> stack = StackWalker.getInstance()
.walk(s -> s.collect(Collectors.toList()));
for (StackWalker.StackFrame sf : stack) {
System.out.println(sf.getClassName() + "::" + sf.getMethodName() + ":" + sf.getLineNumber());
}
}
}
Output
StackWalkingTest::main:6
ข้อดีของ StackWalker
- Lazy evaluation: ไม่ capture full stack trace ทันที ประหยัด performance
- Filterable: กรอง frame ที่ต้องการได้
- Stream-based: ใช้ Stream API ประมวลผลได้
- Caller class: หา caller class ได้แม่นยำด้วย
getCallerClass()
สรุป
StackWalker API เป็นทางเลือกที่ทันสมัยและมีประสิทธิภาพสำหรับ stack walking ใน Java 9+ แทน Thread.getStackTrace()