2017-05-27 22 views
2

私は、アノテーションに最終的なアプリでどのようなクラスがあるのか​​を発見しました。これらの注釈はビルディングプロセスのいくつかのjar変換によって使用されているため、必要ですが、別の話です。

なぜ私の質問はjava.lang.invoke.LambdaForm$Hiddenアノテーションがランタイムアノテーションなのですか?どのコンポーネントがそれを使用していますか?どうして?

答えて

3

これは、スタックトレース内のラムダ関連フレームを隠すためにJVMランタイムによって使用されます。この例を見てみましょう:

public class LambdaStackTrace 
{ 
    public static void main(String[] args) throws Exception 
    { 
     "a".chars().forEach(c -> { 
      new Error().printStackTrace(); 
     }); 
    } 
} 

それは、このスタックトレースを生成します:

java.lang.Error 
    at LambdaStackTrace.lambda$0(LambdaStackTrace.java:6) 
    at java.lang.CharSequence$1CharIterator.forEachRemaining(CharSequence.java:149) 
    at java.util.Spliterators$IntIteratorSpliterator.forEachRemaining(Spliterators.java:1908) 
    at java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:557) 
    at LambdaStackTrace.main(LambdaStackTrace.java:5) 

しかし、場合デバッガでフレームスタックを見て、それはあなたに@Hidden注釈を持っている追加のフレームが表示されます:

enter image description here

関連する問題