2017-08-11 62 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