java堆栈帧,如何在Java 9中使用StackWalker API过滤堆栈帧?

StackWalker API在程序执行期间在堆栈跟踪中提供信息流。此API需要虚拟机捕获整个堆栈的快照,并返回元素数组以进行过滤。我们需要使用walk()方法跳过,删除和限制堆栈帧。我们还可以按类过滤堆栈帧以获取第一个匹配的帧,并使用filter()方法过滤所有匹配的帧。

在下面的示例中,我们可以使用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 filterClasses = new ArrayList<>();

filterClasses.add(StackWalkerFilterTest.class);

System.out.println("--- filter Frame by Class >> get first matching frame ---");

Optional frameByClass = findFrameByClass(filterClasses);

System.out.println(frameByClass.toString());

System.out.println("--- filter Frame by Class >> get all matching frames ---");

List framesByClass = findAllFramesByClass(filterClasses);

System.out.println(framesByClass);

}

private static Optional findFrameByClass(List filterClasses) {

return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)

.walk(s -> s.filter(f -> filterClasses.contains(f.getDeclaringClass())).findFirst());

}

private static List findAllFramesByClass(List 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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值