Stack Walking API ให้กลไกยืดหยุ่นในการเดินและดึงข้อมูลจาก call stacks อนุญาตให้กรองและเข้าถึงเฟรมแบบ lazy StackWalker class เป็น entry point ของ Stack Walking API Stack trace เป็นการแทนของ call stack ณ จุดเวลาหนึ่ง แต่ละ element แทน method invocation มีทุก invocation จากต้นทางของเธรดจนถึงจุดที่สร้าง
ตัวอย่าง: แสดงเฟรมสแต็กทั้งหมดของเธรดปัจจุบัน
import java.lang.StackWalker.StackFrame;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
public class StackWalkerTest {
public static void main(String args[]) throws Exception {
Method test1Method = Helper1.class.getDeclaredMethod("test1", (Class[])null);
test1Method.invoke(null, (Object[]) null);
}
}
// Helper1 class
class Helper1 {
protected static void test1() {
Helper2.test2();
}
}
// Helper2 class
class Helper2 {
protected static void test2() {
List<StackFrame> stack = StackWalker.getInstance().walk(
(s) -> s.collect(Collectors.toList()));
for(StackFrame frame : stack) {
System.out.println(frame.getClassName() + " " +
frame.getLineNumber() + " " + frame.getMethodName());
}
}
}
ผลลัพธ์
Helper2 23 test2
Helper1 16 test1
StackWalkerTest 9 main
เมธอดสำคัญของ StackFrame
getClassName() - ชื่อคลาสgetMethodName() - ชื่อเมธอดgetLineNumber() - หมายเลขบรรทัดgetFileName() - ชื่อไฟล์getDeclaringClass() - คลาสที่ประกาศ (ต้องการ RETAIN_CLASS_REFERENCE)isNativeMethod() - เป็น native method หรือไม่
StackWalker API ให้ประสิทธิภาพดีกว่า Thread.getStackTrace() เพราะเป็น lazy และ filter ได้