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

为什么java注释属性有限制?,java,reflection,annotations,Java,Reflection,Annotations,我注意到,如果我创建一个注释: public @interface NullableTypeOverride { NullableType hibernateTypeOverride(); } 注释属性的选项有限。上面的代码不起作用,因为注释的属性只采用原语、String或Class类型 因此,在这种情况下,我不能像这样使用此注释: @NullableTypeOverride(hibernateTypeOverride = Hibernate.INTEGER) private Long

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

public @interface NullableTypeOverride {
    NullableType hibernateTypeOverride();
}
注释属性的选项有限。上面的代码不起作用,因为注释的属性只采用原语、
String
Class
类型

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

@NullableTypeOverride(hibernateTypeOverride = Hibernate.INTEGER)
private Long distance;
我的猜测是,它与编译时和运行时有关,但我不能完全确定。那么,这种限制的原因是什么?我如何解决它呢?

JLS

如果在中声明的方法的返回类型为 注释类型不是以下类型之一:基元类型, 字符串、类、类的任何参数化调用、枚举类型 (§8.9)、注释类型或数组类型(§10),其元素类型 是上述类型之一

原因是注释必须具有常量值。如果提供对可能更改的对象的引用,则会出现问题。这仅在注释的保留期为运行时时时相关

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()  {...}
这个值应该是多少?反射libs如何缓存它

MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
annotation.person(); // should be the same value every time
记住,注释应该是元数据