2017-05-27 53 views
2

我发现了最终应用程序中确切注释的类。我需要它,因为这些注释在构建过程中被某些jar转换使用,但这是另一回事。

所以我的问题是为什么java.lang.invoke.LambdaForm$Hidden注释是运行时注释?什么组件使用它?为什么?

回答

3

JVM运行时使用它来隐藏堆栈跟踪中的lambda相关帧。就拿这个例子:

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

相关问题