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

时间:2013-09-12 17:06:32

标签: java reflection annotations

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

public @interface NullableTypeOverride {
    NullableType hibernateTypeOverride();
}

我对注释属性的选项有限。上述代码无法使用,因为注释仅为其属性采用原始StringClass类型。

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

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

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

1 个答案:

答案 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

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