【问题标题】:Why java annotation attributes have restrictions?为什么java注解属性有限制?
【发布时间】:2026-01-21 02:35:02
【问题描述】:

我注意到如果我创建一个注释:

public @interface NullableTypeOverride {
    NullableType hibernateTypeOverride();
}

注释属性的选项有限。上面的代码不起作用,因为注解的属性只采用原始的StringClass 类型。

所以在这种情况下我不能像这样使用这个注释:

@NullableTypeOverride(hibernateTypeOverride = Hibernate.INTEGER)
private Long distance;

我的猜测是它与编译时间与运行时有关,但我并不完全确定。那么这个限制的原因是什么,我该如何解决呢?

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    JLS states

    如果方法的返回类型在 注释类型不是以下之一:原始类型, String、Class、Class 的任何参数化调用、枚举类型 (§8.9),注释类型或数组类型(§10),其元素类型 是上述类型之一。

    这样做的原因是注解必须有一个常量值。如果您提供对可能更改的对象的引用,您将遇到问题。这仅在注释的 Retention 为 RUNTIME 时才相关。

    public class Person {
        public String name;
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {
        Person person();
    }
    
    @MyAnnotation(person = ???) // how to guarantee it won't change at runtime?
    public void method1()  {...}
    

    该值应该是什么?以及反射库如何缓存它?

    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
    annotation.person(); // should be the same value every time
    

    请记住,注释应该是元数据。

    【讨论】:

      最近更新 更多