2017-08-11 3 views
4

私はjdk9で導入されたStackWalking APIを検討しています。 StackWalker.Option.SHOW_HIDDEN_FRAMESオプションの有無にかかわらず出力に違いは見られませんでした。 API documentation 1としてStackWalker.Option SHOW_HIDDEN_FRAMESはJava 9でどのように動作するのですか

A Java仮想マシンの実装では、反射フレームに加えて、実装固有の フレームを隠すことがあります。この SHOW_HIDDEN_FRAMESオプション付きStackWalkerは、すべての隠された( 反射フレームを含む)のフレーム

は誰も私を理解して助けてくださいが表示されます正確にどのフレーム反射フレームに加えて、JVMの非表示はできますか?このオプションの正確な使い方は何ですか?

これは私のデモコードです:あなたは、Java 9で働いていないの意味でした何

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

わかりません。ここで、あなたのように詳細に同様のコードの出力を説明するために、this sample codeを使用して:StackFrameをのクラスオブジェクトがこのStackWalkerによって歩い

StackWalker.Option.RETAIN_CLASS_REFERENCEディスプレイ。

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 ここにお知らせ声明java.base/java.lang.reflect.Method.invoke(Method.java:564)、このオプションはすべての反射フレームを示し、同様のドキュメントで述べたように

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) 

全て反射フレームを表示しますMethod.invoke(o1,o2)およびConstructor.newInstance(o)


StackWalker.Option.SHOW_HIDDEN_FRAMES すべての隠されたフレームを表示します。ラムダの操作を行うためのフレーム(実装固有フレーム)であり、このオプションを使用してアクセスinternal/experiment.StackWalkerDemo$$Lambda$23/1358444045.accept(Unknown Source)ため

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) 

ルック。

+1

これは私が探していたものです。私のプログラムでは、Option.SHOW_REFLECT_FRAMESとOption.SHOW_HIDDEN_FRAMESの同じ出力を観察していました。他にもいくつかの例を試しましたが、SHOW_HIDDEN_FRAMESを使用した出力が異なるユースケースは見つかりませんでした。 他のユースケースに気づいていますか? – CuriousCoder

+1

@VikramSherigarすでに出力されているこの違いを反映した、回答にリンクされている[github sample code](https://github.com/namannigam/Jigsaw/blob/master/internal/src/experiment/StackWalkerDemo.java)があります。希望が役立ちます。 :) – nullpointer

関連する問題