您好,欢迎访问一九零五行业门户网

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

stackwalkerapi 在程序执行期间提供堆栈跟踪中的信息流。此 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<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)]
以上就是如何在java 9中使用stackwalker api过滤堆栈帧?的详细内容。
其它类似信息

推荐信息