如何使用Java中的StackWalker API打印不同的堆栈帧?

2023年 9月 7日 30.6k 0

如何使用Java中的StackWalker API打印不同的堆栈帧?

Java 9 定义了一个StackWalkerAPI,它提供惰性和帧过滤。 StackWalker对象允许我们遍历和访问堆栈,并包含一个有用的方法:walk()。此方法为当前线程打开一个StackFrame流,然后将该函数应用于该StackFrame流。我们需要获取StackWalker对象,然后使用StackWalker.getInstance()方法。

在下面的示例中,我们可以打印不同的内容堆栈帧:所有堆栈帧、跳过某些堆栈帧以及使用StackWalkerAPI 限制堆栈帧。 p>

示例

import java.lang.StackWalker.StackFrame;
import java.util.*;
import java.util.stream.*;

public class StackWalkerTest {
public static void main(String args[]) {
new StackWalkerTest().walk();
}
private void walk() {
new Walker1().walk();
}
private class Walker1 {
public void walk() {
new Walker2().walk();
}
}
private class Walker2 {
public void walk() {
Method1();
}
void Method1() {
Method2();
}
void Method2() {
StackWalker stackWalker = StackWalker.getInstance(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES), 16);
Stream stackStream = StackWalker.getInstance().walk(f -> f);

System.out.println("--- Walk all StackFrames ---");
List stacks = walkAllStackframes();
System.out.println(stacks);

System.out.println("--- Skip some StackFrames ---");
List stacksAfterSkip = walkSomeStackframes(3);
System.out.println(stacksAfterSkip);

System.out.println("--- Limit StackFrames ---");
List stacksByLimit = walkLimitStackframes(3);
System.out.println(stacksByLimit);
}
private List walkAllStackframes() {
return StackWalker.getInstance().walk(s -> s.map(frame -> "n" + frame.getClassName() + "/" + frame.getMethodName()).collect(Collectors.toList()));
}
private List walkSomeStackframes(int numberOfFrames) {
return StackWalker.getInstance().walk(s -> s.map(frame -> "n" + frame.getClassName() + "/" + frame.getMethodName()).skip(numberOfFrames).collect(Collectors.toList()));
}
private List walkLimitStackframes(int numberOfFrames) {
return StackWalker.getInstance().walk(s -> s.map(frame -> "n" + frame.getClassName() + "/" + frame.getMethodName()).limit(numberOfFrames).collect(Collectors.toList()));
}
}
}

登录后复制

输出

--- Walk all StackFrames ---
[
StackWalkerTest$Walker2/walkAllStackframes,
StackWalkerTest$Walker2/Method2,
StackWalkerTest$Walker2/Method1,
StackWalkerTest$Walker2/walk,
StackWalkerTest$Walker1/walk,
StackWalkerTest/walk,
StackWalkerTest/main
]
--- Skip some StackFrames ---
[
StackWalkerTest$Walker2/walk,
StackWalkerTest$Walker1/walk,
StackWalkerTest/walk,
StackWalkerTest/main
]
--- Limit StackFrames ---
[
StackWalkerTest$Walker2/walkLimitStackframes,
StackWalkerTest$Walker2/Method2,
StackWalkerTest$Walker2/Method1
]

登录后复制

以上就是如何使用Java中的StackWalker API打印不同的堆栈帧?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论