【问题标题】:How will I know the annotations of a Java class?我如何知道 Java 类的注释?
【发布时间】:2018-10-17 09:44:46
【问题描述】:

我需要知道 Java 类的注解。我正在使用龙目岛。

示例是:

@Data
@Builder
public class JavaBean {}

我尝试了 java.lang.annotation.Annotation[] annotation = JavaBean.class.getAnnotations 但它没有显示 Data 和 Builder。

【问题讨论】:

  • @Data 生成通常与简单 POJO(普通旧 Java 对象)和 bean 相关联的所有样板:所有字段的 getter,所有非最终字段的 setter,以及适当的 toString、equals 和哈希码

标签: java annotations lombok


【解决方案1】:

我认为您看不到 JavaBean.class.getAnnotations 中的注释,因为 @Retention 等于 SOURCE。

运行时不需要这种注解。

更多详情:Annotation SOURCE Retention Policy

祝你有美好的一天。

【讨论】:

    【解决方案2】:

    答案就在这些注释的来源中:

    @Target({TYPE, METHOD, CONSTRUCTOR})
    @Retention(SOURCE)
    public @interface Builder {
    .....
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Data {
    .....
    

    您获取注释的代码是正确的,但它是 @Retention(RetentionPolicy.SOURCE) 在这里发挥作用。

    Java 通过java.lang.annotation.RetentionPolicy 枚举定义了3 种类型的保留策略。它有SOURCECLASSRUNTIME

    1) 带有保留策略SOURCE 的注解将仅与源代码一起保留,并在编译期间被丢弃。

    2) 带有保留策略CLASS 的注解将一直保留到编译代码,并在运行时丢弃。

    3) 带有保留策略RUNTIME 的注解将通过运行时提供给 JVM。

    @Data@Builder 标有@Retention(SOURCE),这意味着这些注释在运行时不存在于您的类中,因此您无法获取这些注释..

    【讨论】:

    • 在 Lombok 的情况下有一个很好的理由:您不希望使用它构建的每个项目都对 Lombok jar 具有运行时依赖项。
    • @biziclop 也是在编译代码后完成这些注释的目的(生成这些注释所期望的生成代码),因此在运行时保留相同的内容是没有意义的。请更正如果我错了,我。
    • 这也是绝对正确的。我只是想有人可能会问“是的,但是为什么我们不能留下注释呢?”。答案是,如果它们一直保留到运行时,则无法在没有 JAR 的情况下加载类路径上带有 Lombok 注释的类。
    【解决方案3】:

    Lombok 注解在实际编译之前进行了预处理,因此编译后的类不包含它们作为注解,而是作为已经生成的代码。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多