我注意到如果我创建了一个注释:
public @interface NullableTypeOverride {
NullableType hibernateTypeOverride();
}
我对注释属性的选项有限。上述代码无法使用,因为注释仅为其属性采用原始String
或Class
类型。
所以在这种情况下我不能像这样使用这个注释:
@NullableTypeOverride(hibernateTypeOverride = Hibernate.INTEGER)
private Long distance;
我的猜测是它与编译时间与运行时有关,但我不完全确定。那么这种限制的原因是什么?我该如何解决它呢?
答案 0 :(得分:5)
JLS states
如果声明的方法的返回类型,则是编译时错误 注释类型不是以下之一:基本类型, 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
请记住,注释应该是元数据。