StackWalker.Option SHOW_HIDDEN_FRAMES 如何在 Java 中工作 9
How does StackWalker.Option SHOW_HIDDEN_FRAMES work in Java 9
我一直在探索 jdk9 中引入的 StackWalking API。使用或不使用 StackWalker.Option.SHOW_HIDDEN_FRAMES
.
选项,我看不出输出有任何差异
A Java Virtual Machine implementation may hide implementation specific
frames in addition to reflection frames. A StackWalker with this
SHOW_HIDDEN_FRAMES option will show all hidden frames (including
reflection frames)
谁能帮助我了解除了反射帧之外,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);
}
}
}
不确定 在 Java 9 中不工作是什么意思。在这里,使用this sample code,详细解释与您类似的代码的输出:
StackWalker.Option.RETAIN_CLASS_REFERENCE
displays the Class object in StackFrames walked by this StackWalker.
internal/experiment.StackWalkerDemo.lambda$d[=10=](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)
StackWalker.Option.SHOW_REFLECT_FRAMES
Shows all reflection frames
internal/experiment.StackWalkerDemo.lambda$d[=11=](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)
注意这里的语句java.base/java.lang.reflect.Method.invoke(Method.java:564)
,正如文档中提到的,这个选项显示了所有反射帧,包括Method.invoke(o1,o2)
和Constructor.newInstance(o)
.
StackWalker.Option.SHOW_HIDDEN_FRAMES
Shows all hidden frames.
internal/experiment.StackWalkerDemo.lambda$d[=12=](StackWalkerDemo.java:29)
internal/experiment.StackWalkerDemo$$Lambda/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)
寻找internal/experiment.StackWalkerDemo$$Lambda/1358444045.accept(Unknown Source)
,这是一个用于对 lambda 执行操作的框架(实现特定框架)并且是使用此选项可访问。
我一直在探索 jdk9 中引入的 StackWalking API。使用或不使用 StackWalker.Option.SHOW_HIDDEN_FRAMES
.
A Java Virtual Machine implementation may hide implementation specific frames in addition to reflection frames. A StackWalker with this SHOW_HIDDEN_FRAMES option will show all hidden frames (including reflection frames)
谁能帮助我了解除了反射帧之外,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);
}
}
}
不确定 在 Java 9 中不工作是什么意思。在这里,使用this sample code,详细解释与您类似的代码的输出:
StackWalker.Option.RETAIN_CLASS_REFERENCE
displays the Class object in StackFrames walked by this StackWalker.
internal/experiment.StackWalkerDemo.lambda$d[=10=](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)
StackWalker.Option.SHOW_REFLECT_FRAMES
Shows all reflection frames
internal/experiment.StackWalkerDemo.lambda$d[=11=](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)
注意这里的语句java.base/java.lang.reflect.Method.invoke(Method.java:564)
,正如文档中提到的,这个选项显示了所有反射帧,包括Method.invoke(o1,o2)
和Constructor.newInstance(o)
.
StackWalker.Option.SHOW_HIDDEN_FRAMES
Shows all hidden frames.
internal/experiment.StackWalkerDemo.lambda$d[=12=](StackWalkerDemo.java:29)
internal/experiment.StackWalkerDemo$$Lambda/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)
寻找internal/experiment.StackWalkerDemo$$Lambda/1358444045.accept(Unknown Source)
,这是一个用于对 lambda 执行操作的框架(实现特定框架)并且是使用此选项可访问。