选项SHOW_HIDDEN_框架在Java9中如何工作
我一直在探索jdk9中引入的StackWalking API。无论是否使用选项SHOW_HIDDEN_框架在Java9中如何工作,java,java-9,Java,Java 9,我一直在探索jdk9中引入的StackWalking API。无论是否使用StackWalker.option.SHOW\u HIDDEN\u FRAMES,我都看不出输出有什么不同 根据: Java虚拟机实现可能隐藏特定于实现的内容 除了反射帧之外的帧。带着这个的斯塔克沃克 “显示隐藏帧”选项将显示所有隐藏帧(包括 反射框) 有人能帮我理解除了反射帧之外JVM还能隐藏哪些确切的帧吗?这个选项的确切用途是什么 这是我的演示代码: class DemoClass { public sta
StackWalker.option.SHOW\u HIDDEN\u FRAMES
,我都看不出输出有什么不同
根据:
Java虚拟机实现可能隐藏特定于实现的内容
除了反射帧之外的帧。带着这个的斯塔克沃克
“显示隐藏帧”选项将显示所有隐藏帧(包括
反射框)
有人能帮我理解除了反射帧之外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);
}
}
}
不确定不使用Java9是什么意思。在此,使用,详细解释与您类似的代码的输出: 显示此StackWalker遍历的StackFrames中的类对象
显示所有反射帧 请注意这里的语句
java.base/java.lang.reflect.Method.invoke(Method.java:564)
,正如文档中提到的,该选项显示了所有反射帧,包括Method.invoke(o1,o2)
和Constructor.newInstance(o)
显示所有隐藏的帧
查找
内部/实验。StackWalkerDemo$$Lambda$23/1358444045.accept(未知源)
这是一个用于在Lambda上执行操作的帧(特定于实现的帧),可以使用此选项访问。这是我一直在寻找的。在我的程序中,我观察了Option.SHOW\u REFLECT\u FRAMES和Option.SHOW\u HIDDEN\u FRAMES的相同输出。我也尝试了一些其他的例子,但是找不到使用SHOW_HIDDEN_框架输出不同的用例。你知道其他的用例吗?@VikramSherigar答案中已经有一个链接,反映了输出中的这种差异。希望有帮助。:)
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)
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)
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)