我一直在探索jdk9中引入的StackWalking API.无论有没有选项,我都看不出输出有什么不同StackWalker.Option.SHOW_HIDDEN_FRAMES.
根据API文档:
除了反射帧之外,Java虚拟机实现还可以隐藏特定于实现的帧.具有此SHOW_HIDDEN_FRAMES选项的StackWalker将显示所有隐藏的帧(包括反射帧)
任何人都可以帮助我了解除反射帧之外JVM可以隐藏哪些确切的帧?这个选项的确切用途是什么?
这是我的演示代码:
class DemoClass {
public static void a() {
b();
}
static void b() {
c();
}
static void c() {
d();
}
static void d() {
StackWalker sw = StackWalker.getInstance(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES));
sw.forEach(System.out::println);
}
}
public class StackWalkerAPI {
public static void main(String[] args) {
try {
Method methodA = Class.forName("DemoClass").getMethod("a");
methodA.invoke(null, (Object[]) null);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(StackWalkerAPI.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不确定你在Java 9中工作的意思是什么.在这里,使用此示例代码,详细解释与您类似的代码的输出:
StackWalker.Option.RETAIN_CLASS_REFERENCE显示此StackWalker所走的StackFrames中的Class对象.
internal/experiment.StackWalkerDemo.lambda$d$0(StackWalkerDemo.java:29)
java.base/java.lang.Iterable.forEach(Iterable.java:75)
internal/experiment.StackWalkerDemo.d(StackWalkerDemo.java:28)
internal/experiment.StackWalkerDemo.c(StackWalkerDemo.java:20)
internal/experiment.StackWalkerDemo.b(StackWalkerDemo.java:16)
internal/experiment.StackWalkerDemo.a(StackWalkerDemo.java:12)
internal/experiment.StackWalkerAPI.main(StackWalkerAPI.java:15)
Run Code Online (Sandbox Code Playgroud)
internal/experiment.StackWalkerDemo.lambda$d$0(StackWalkerDemo.java:29)
java.base/java.lang.Iterable.forEach(Iterable.java:75)
internal/experiment.StackWalkerDemo.d(StackWalkerDemo.java:28)
internal/experiment.StackWalkerDemo.c(StackWalkerDemo.java:20)
internal/experiment.StackWalkerDemo.b(StackWalkerDemo.java:16)
internal/experiment.StackWalkerDemo.a(StackWalkerDemo.java:12)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
internal/experiment.StackWalkerAPI.main(StackWalkerAPI.java:15)
Run Code Online (Sandbox Code Playgroud)
请注意java.base/java.lang.reflect.Method.invoke(Method.java:564)此处的语句,如文档中所述,此选项显示所有反射帧,包括Method.invoke(o1,o2)和Constructor.newInstance(o).
StackWalker.Option.SHOW_HIDDEN_FRAMES显示所有隐藏的帧.
internal/experiment.StackWalkerDemo.lambda$d$0(StackWalkerDemo.java:29)
internal/experiment.StackWalkerDemo$$Lambda$23/1358444045.accept(Unknown Source)
java.base/java.lang.Iterable.forEach(Iterable.java:75)
internal/experiment.StackWalkerDemo.d(StackWalkerDemo.java:28)
internal/experiment.StackWalkerDemo.c(StackWalkerDemo.java:20)
internal/experiment.StackWalkerDemo.b(StackWalkerDemo.java:16)
internal/experiment.StackWalkerDemo.a(StackWalkerDemo.java:12)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
internal/experiment.StackWalkerAPI.main(StackWalkerAPI.java:15)
Run Code Online (Sandbox Code Playgroud)
查找internal/experiment.StackWalkerDemo$$Lambda$23/1358444045.accept(Unknown Source)哪个是用于对lambda执行操作的帧(特定于实现的帧),并且可以使用此选项访问.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |