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

Ada*_*old 7 java reflection annotations

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

public @interface NullableTypeOverride {
    NullableType hibernateTypeOverride();
}
Run Code Online (Sandbox Code Playgroud)

我对注释属性的选择有限.上面的代码不起作用,因为注释只为其属性采用原始StringClass类型.

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

@NullableTypeOverride(hibernateTypeOverride = Hibernate.INTEGER)
private Long distance;
Run Code Online (Sandbox Code Playgroud)

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

Sot*_*lis 6

JLS 表示

如果在注释类型中声明的方法的返回类型不是以下之一,则是编译时错误:基本类型,字符串,类,类的任何参数化调用,枚举类型(第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()  {...}
Run Code Online (Sandbox Code Playgroud)

应该是什么价值?反射库如何缓存呢?

MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
annotation.person(); // should be the same value every time
Run Code Online (Sandbox Code Playgroud)

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