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.

选项,我看不出输出有任何差异

根据 API documentation:

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 执行操作的框架(实现特定框架)并且是使用此选项可访问。