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

如何在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 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()));    } }登录后复制