Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用String.format()作为注释属性值_Java_Annotations_Constants_String Formatting - Fatal编程技术网

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

Java 使用String.format()作为注释属性值,java,annotations,constants,string-formatting,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 = Str

我有一个类,它有许多常量:

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
更改为一个简单的
字符串
,它就可以正常工作:

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

使用
String.format()
有什么问题?字段为
静态
最终
,可能会出现什么错误?

编译时不知道
字符串.format()
的值,而
字符串
文本是未知的


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

是的,好吧,但是如果普通
String
文本支持Java格式,那就更好了<代码>格式(“hasRole('%s'),ROLE\u NAME)看起来比
“hasRole('“+ROLE\u NAME+”)”)”
我。。。或者我做了太多python编程工作。:-)我知道这太晚了,@parxier您是否考虑过启用
@Secured
注释(
@EnableGlobalMethodSecurity(securedEnabled=true)
)?然后,你可以做一些事情,比如“代码> @安全”({ RoLyNeN})< />代码(角色名应该有一个显式的RoLyf前缀,例如:代码> RoLyNeNe=“RoLyAdmin”;),遗憾的是,java没有C++的CONTHEXPR关键字: