使用 StackWalker 惰性检查栈帧,避免实体化完整的栈跟踪。
代码对比
✕ Materialized stack trace
StackTraceElement caller = Thread.currentThread()
.getStackTrace()[2];
String callerClass = caller.getClassName();
✓ Java 9+
String callerClass = StackWalker.getInstance()
.walk(frames -> frames.skip(1)
.findFirst()
.orElseThrow()
.getClassName());
发现此代码有问题? 告诉我们。
为什么现代方式更好
惰性遍历
只访问操作所需的栈帧。
流式处理友好
使用标准流操作进行筛选和选择。
可配置
选项支持类引用以及隐藏帧或反射帧。
旧方式
Thread.getStackTrace()
现代方式
StackWalker
自 JDK
9
难度
中级
JDK 支持
使用 StackWalker 惰性检查栈
可用
自 JDK 9 起广泛可用(2017 年 9 月)
工作原理
StackWalker 提供栈帧的惰性流,并支持以可配置方式访问保留的类引用。代码找到所需栈帧后即可停止,无需分配完整的栈跟踪数组。
相关文档
证明