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。。那是个打字错误。。。所以,没有办法在其他地方定义这个数组?我试图避免重复它,以保持一致性…其他地方?文件、数据库、网络?不完全是我想要的,但这绝对是一个干净的解决方案,我可以让它工作。非常感谢,谢谢!