2017-08-11 60 views
4

我一直在探索jdk9中引入的StackWalking API。我看不出有或没有选项StackWalker.Option.SHOW_HIDDEN_FRAMES的输出有任何差异。StackWalker.Option SHOW_HIDDEN_FRAMES如何在Java 9中工作

由于每API documentation

Java虚拟机实现可能隐藏在除了反射框架实施的具体 帧。与此 SHOW_HIDDEN_FRAMES选择A 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); 
     } 

    } 
} 

回答

6

不知道你是怎么通过意味着Java的9不工作。在这里,用this sample code,在细节的类似的代码输出解释为你的:

StackWalker.Option.RETAIN_CLASS_REFERENCE显示在StackFrames Class对象走过这StackWalker。

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) 

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) 

公告声明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) 

查找internal/experiment.StackWalkerDemo$$Lambda$23/1358444045.accept(Unknown Source)其是用于对拉姆达执行操作(实现特定的帧)的帧和是可访问的使用这个选项。

+1

这就是我一直在寻找的东西。在我的程序中,我一直在观察与Option.SHOW_REFLECT_FRAMES&Option.SHOW_HIDDEN_FRAMES相同的输出。我也尝试了其他几个例子,但是找不到使用SHOW_HIDDEN_FRAMES的输出的用例。 您是否知道任何其他用例? – CuriousCoder

+1

@VikramSherigar在回答中已经链接了[github示例代码](https://github.com/namannigam/Jigsaw/blob/master/internal/src/experiment/StackWalkerDemo.java),该回答反映了输出中的这种差异。希望有所帮助。 :) – nullpointer