我有一个有许多常量的类:
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()
有什么问题?字段为static
和final
,哪些可能出错?
答案 0 :(得分:8)
String.format()
的值在编译时是未知的,而String
字面值是。
由于注释是编译类的元数据,因此在编译器生成最终.class文件时必须知道它们的值。由于String.format()
的值仅在代码实际运行时才会被识别,因此编译器不允许您将其用作注释的一部分。