为什么java.lang.invoke.LambdaForm $ Hidden批注是运行时批注?

时间:2017-05-27 05:51:28

标签: java annotations

我已经发现最终应用程序中哪些注释具有类。我需要它,因为这些注释在构建过程中通过一些jar转换使用,但它是另一个故事。

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

1 个答案:

答案 0 :(得分: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