为什么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
记住,注释应该是元数据