Java 在自定义注释中使用数组
我有一个类,它定义了一系列内容,即目标名称和参数数组:Java 在自定义注释中使用数组,java,arrays,annotations,Java,Arrays,Annotations,我有一个类,它定义了一系列内容,即目标名称和参数数组: public class Actions { protected static final String A_TARGET = "do_a"; protected static final String[] A_ARGS = { "paramA", "paramB" }; ... } 我试图编写自定义注释以避免在构造函数中注册操作,因此我定义了: public @interface MyAnno{ S
public class Actions {
protected static final String A_TARGET = "do_a";
protected static final String[] A_ARGS = { "paramA", "paramB" };
...
}
我试图编写自定义注释以避免在构造函数中注册操作,因此我定义了:
public @interface MyAnno{
String actionTarget();
String[] actionArgs();
}
我试着这样使用它:
@MyAnno(
actionTarget = Actions.A_TARGET,
actionArgs = Actions.A_ARGS <-- compile error
)
public void doA() {
}
但是,我遇到了标记行的问题,将参数的字符串数组传递给注释的问题:
注释属性MyAnno.A_ARGS的值必须是数组初始值设定项
如果我用我在Actions类{paramA,paramB}中定义的数组替换Actions.A_ARGS,错误就会消失
我的问题是:
如何在别处定义这个args数组,然后在注释中使用它
不能将静态数组字段值用作注释值,因为它不是常量表达式 考虑以下示例:
@Target(ElementType.METHOD)
public @interface MyAnno {
String[] arrayParam();
String stringParam();
}
public static final String[] arrayConstant = {"x", "y"};
public static final String stringConstant = "z";
static {
stringConstant = "t"; // error, final string cannot be changed
arrayConstant[0] = "t"; // valid (thus array is not constant)
}
@MyAnno(
arrayParam = arrayConstant, // error, array is not a constant
stringParam = stringConstant // valid, static final string field is a constant
)
void myMethod() {
}
静态最终字符串字段是正确的常量表达式,因为它们不能在运行时更改,所以编译器将它们标记为常量
静态最终数组字段始终可以在运行时更改,因此编译器无法将其标记为常量。这在Java中是不可行的 有关详细信息,请参见此问题: 最好的方法是将单个数组项定义为常量并重用它们,即
public class Actions {
protected static final String A_TARGET = "do_a";
protected static final String PARAM_A = "paramA";
protected static final String PARAM_B = "paramB";
protected static final String[] A_ARGS = { PARAM_A, PARAM_B };
...
}
然后
@MyAnno(
actionTarget = Actions.A_TARGET,
actionArgs = {Actions.PARAM_A, Actions.PARAM_B}
)
public void doA() {
}
这将有助于避免字符串重复和打字错误,但不会解决组合的重复问题 此受保护的静态最终字符串A_ARGS={paramA,paramB};是无效的Java,此actionArgs=Actions.A_ARGS将不起作用,因为A_ARGS不是常量。看起来您需要复制批注中A_ARGS的内容。这不是有效的java吗?这是什么意思?这是一个预先存在的类,在整个项目中都被积极使用。它怎么也不是常数?这是一个静态的结尾?他可能是说它应该是String[]a_ARGS={paramA,paramB}所以String[]而不是String,但我确信这只是一个拼写错误,与这里无关。但他是对的,Java不允许您直接将数组初始值设定项以外的任何内容放在那里。。。就是那样让人讨厌。哎呀:/yeah。。那是个打字错误。。。所以,没有办法在其他地方定义这个数组?我试图避免重复它,以保持一致性…其他地方?文件、数据库、网络?不完全是我想要的,但这绝对是一个干净的解决方案,我可以让它工作。非常感谢,谢谢!