【问题标题】:Annotation SOURCE Retention Policy注释 SOURCE 保留政策
【发布时间】:2011-11-08 10:23:53
【问题描述】:

来自 Java 文档:

类: 注释将由编译器记录在类文件中,但不需要在运行时由 VM 保留。

运行时间: 注释将由编译器记录在类文件中,并在运行时由 VM 保留,因此可以反射性地读取它们。

来源: 注释将被编译器丢弃。

我了解 RUNTIME(为了使用带反射的注解)和 CLASS(对于编译器)的用法,但我不明白什么时候可以使用

@Retention(RetentionPolicy.SOURCE)

你能解释一下吗?

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    像@SuppressWarnings、@Override 这样的东西是编译器使用的注解——在运行时不需要。对于那些 RetentionPolicy.SOURCE 是有意义的。注释也可用于生成代码(查看 Spring ROO)——运行时也不需要此类注释。

    【讨论】:

    • 为什么不是 RetentionPolicy.CLASS?
    • +1:编译器使用的一些注解是类保留。
    • 字节码中不需要这些(在.class文件中)。
    • @JohnJohnGa,编译器只需要立即编译的代码的 SuppressWarnings 和 Override 注释。 Deprecated 需要是 CLASS 或 RUNTIME,因为它可能会导致稍后编译的代码中出现警告(使用它)
    • 我有时会创建SOURCE 注释作为“待办事项”、“陷阱”、“陷阱”或简单的“提醒”。我可以选择为它编写处理器或在 IDE 中搜索它
    【解决方案2】:

    这个答案很有意义 - https://stackoverflow.com/a/43910948/3009968

    您不希望包含一个依赖项,即使在编译代码之前就已经实现了它的预期效果。例如。 @SuppressWarnings

    您不想包含编译器用来生成代码但在运行时根本不需要的依赖项。例如。如上一个答案 -spring roo 中所述。

    【讨论】:

      【解决方案3】:

      RetentionPolicy.CLASS - 定义的注解将存储在 .class 文件中,但在运行时不可用。如果您根本不指定任何保留策略,这是默认保留策略。

      RetentionPolicy.SOURCE - 编译器在构建代码时将忽略定义的注解。所以注解只在源代码中可用,在.class文件中不可用,在运行时也不可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 2018-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多