【问题标题】:Error setting annotation value as Class<?> from a constant, why?从常量将注释值设置为 Class<?> 时出错,为什么?
【发布时间】:2011-12-19 17:10:08
【问题描述】:

这是我的注释:

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

这样就可以了:

@AuditUpdate(User.class)
void someMethod(){}

但是通过这种方式:

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

我有这个编译错误:

The value for annotation attribute AuditUpdate.value must be a class literal

为什么?这是什么意思?

谢谢。

【问题讨论】:

    标签: java annotations


    【解决方案1】:

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

    类文字在JLS中定义良好:

    15.8.2 类文字

    类字面量是由类名组成的表达式, 接口、数组或原始类型,后跟“.”和令牌 班级。类文字的类型是 Class。它评估为类 由定义定义的命名类型(或 void)的对象 当前实例的类的类加载器。

    所以,你不能那样做。

    【讨论】:

    • @francadaval - 注释的信息在编译时被解析,你所做的需要静态初始化运行才能确定类的值。采取这是一个极端 - 如果你有:... ENTITY_CLASS = pick_my_class();反而?现在编译器必须以某种神奇的方式知道将返回什么。他们决定只允许文字,因为编译器可以简单地解析它。
    • @James +1 完成答案。
    猜你喜欢
    • 2010-11-13
    • 2018-10-12
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多