将注释值设置为Class <?>时出错,为什么?

fra*_*val 2 java annotations

这是我的注释:

@Target( { ElementType.METHOD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditUpdate
{
    Class<?> value();
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式它是好的:

@AuditUpdate(User.class)
void someMethod(){}
Run Code Online (Sandbox Code Playgroud)

但通过这种方式:

private static final Class<?> ENTITY_CLASS = User.class;
@AuditUpdate(ENTITY_CLASS)
void someMethod(){}
Run Code Online (Sandbox Code Playgroud)

我有这个编译错误:

The value for annotation attribute AuditUpdate.value must be a class literal
Run Code Online (Sandbox Code Playgroud)

为什么?那是什么意思?

谢谢.

yai*_*air 5

这意味着您必须传递一个类文字,而不是一个变量(即使是常量).

JLS中定义了一个类文字:

15.8.2类文字

类文字是一个表达式,由类,接口,数组或基本类型的名称组成,后跟一个"." 和令牌类.类文字的类型是Class.它计算为由当前实例的类的定义类加载器定义的命名类型(或void)的Class对象.

所以,你不能这样做.

  • @francadaval - 注释的信息正在编译时被解析,而你正在做的事情需要静态初始化才能确定类的值.要把它变为极端 - 如果你有:... ENTITY_CLASS = pick_my_class(); 代替?现在,编译器必须以某种方式神奇地知道将返回什么.他们决定只允许文字,因为编译器可以简单地解决它. (4认同)