StackWalker.Option SHOW_HIDDEN_FRAMES如何在Java 9中工作

Cur*_*der 4 java java-9

我一直在探索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)

Nam*_*man 5

不确定你在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)

StackWalker.Option.SHOW_REFLECT_FRAMES 显示所有反射帧

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执行操作的(特定实现的帧),并且可以使用此选项访问.