使用String.format()作为注释属性值

时间:2011-05-19 02:14:35

标签: java annotations constants string-formatting

我有一个有许多常量的类:

public class SecurityConstants {
    private static final String HAS_ROLE_TEMPLATE = "hasRole('%s')";

    public static final String ROLE_USER_INTERNAL = "ROLE_USER_INTERNAL";
    public static final String HAS_ROLE_USER_INTERNAL = String.format(HAS_ROLE_TEMPLATE, ROLE_USER_INTERNAL);
}

如果我尝试使用HAS_ROLE_USER_INTERNAL作为@PreAuthorize注释属性值,则此@PreAuthorize(SecurityConstants.HAS_ROLE_USER_INTERNAL)编译器将失败:

  

注释属性的值   PreAuthorize.value必须是常量   表达

但是,如果我将HAS_ROLE_USER_INTERNAL更改为简单的String,那就可以了。

public static final String HAS_ROLE_USER_INTERNAL = "hasRole('ROLE_USER_INTERNAL')";

使用String.format()有什么问题?字段为staticfinal,哪些可能出错?

1 个答案:

答案 0 :(得分:8)

String.format()的值在编译时是未知的,而String字面值是。

由于注释是编译类的元数据,因此在编译器生成最终.class文件时必须知道它们的值。由于String.format()的值仅在代码实际运行时才会被识别,因此编译器不允许您将其用作注释的一部分。