为什么Java注释属性有限制?

7

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

public @interface NullableTypeOverride {
    NullableType hibernateTypeOverride();
}

我的注释属性选项有限。上述代码将无法工作,因为注释只能使用原始、StringClass类型的属性。

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

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

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

1个回答

6
JLS(Java 语言规范)规定

如果在注解类型中声明的方法的返回类型不是以下类型之一,则会在编译时出现错误:原始类型、String、Class、任何参数化的 Class 调用、枚举类型(§8.9)、注解类型或元素类型为前述类型之一的数组类型(§10)。

这是因为注解必须具有恒定的值。如果您提供对可能更改的对象的引用,则会遇到问题。这仅在注解的保留期为 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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接