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

par*_*ier 6 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);
}
Run Code Online (Sandbox Code Playgroud)

如果我再尝试使用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')";
Run Code Online (Sandbox Code Playgroud)

使用有什么问题String.format()?现场是staticfinal,有什么能可能出错?

dle*_*lev 8

String.format()在编译时不知道值,而String文字是.

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