【问题标题】:Why the java.lang.invoke.LambdaForm$Hidden annotation is runtime annotation?为什么 java.lang.invoke.LambdaForm$Hidden 注释是运行时注释?
【发布时间】:2017-05-27 05:51:28
【问题描述】:

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

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

【问题讨论】:

  • 升级到 gradle kts 文件后,我使用 java.lang.ClassNotFoundException: java.lang.invoke.LambdaForm 在我的 android 单元测试中遇到错误

标签: java annotations


【解决方案1】:

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 注释的附加帧:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多