如何在Java 9中使用StackWalker API过滤堆栈帧?
StackWalker API在程序执行期间在堆栈跟踪中提供信息流。此API需要虚拟机捕获整个堆栈的快照,并返回元素数组以进行过滤。我们需要使用walk()方法跳过,删除和限制堆栈帧。我们还可以按类过滤堆栈帧以获取第一个匹配的帧,并使用filter()方法过滤所有匹配的帧。
在下面的示例中,我们可以使用StackWalkerAPI过滤堆栈帧。
示例
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)]
热门推荐
10 八一幼儿祝福语大全简短
11 公司乔迁食堂祝福语简短
12 婚礼结束聚餐祝福语简短
13 儿媳买车妈妈祝福语简短
14 毕业送礼老师祝福语简短
15 同事辞职正常祝福语简短
16 恭贺新婚文案祝福语简短
17 金店立秋祝福语简短英文
18 婆婆高寿祝福语大全简短