AnnotationRetention.BINARY 的用例是什么?

Dav*_*son 8 kotlin

根据Kotlin 语言规范,注释保留分为三种类型:

  • 源保留(可通过源处理工具访问);
  • 二进制保留(保留在编译工件中);
  • 运行时保留(在运行时可访问)。

查看 JVM 上 kotlin-stdlib 的 KDoc,我们得到以下内容:

public enum class AnnotationRetention {
    /** Annotation isn't stored in binary output */
    SOURCE,
    /** Annotation is stored in binary output, but invisible for reflection */
    BINARY,
    /** Annotation is stored in binary output and visible for reflection (default retention) */
    RUNTIME
}
Run Code Online (Sandbox Code Playgroud)

我可以理解SOURCE(可用于注释处理器检查)和RUNTIME(可用于使用反射检查)的用例,但我无法理解BINARY.

有人可以解释一下这种类型保留的用例吗?如果不需要的话我为什么要选择BINARY呢?SOURCERUNTIME

Dav*_*son 11

根据Alexey Romanov的评论,在注释处理和运行时反射之外有一个注释用例,这在Java 注释的答案中显示 - 寻找 RetentionPolicy.CLASS 的示例

例如,Proguard 获取.jar文件并对它们执行混淆和收缩,如下图Proguard 网站所示:

Proguard 管道包括输入 jar、收缩、然后输出 jar

@Keep注释告诉 Proguard 在收缩期间不要删除目标。由于 Proguard 对文件进行操作,因此这种注释必须存在于二进制文件中.jar。由于@Keep不打算在运行时使用反射进行检查,因此它是AnnotationRetention.BINARY.