在自定义注释中使用数组

时间:2016-10-08 20:27:39

标签: 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{

    String actionTarget();
    String[] actionArgs();
}

我正试图这样使用它:

@MyAnno(
    actionTarget = Actions.A_TARGET,
    actionArgs = Actions.A_ARGS   <-- compile error
)
public void doA() {
}

然而,我遇到了标记行的问题,这是将参数的String数组传递给注释的问题:

  

注释属性MyAnno.A_ARGS的值必须是数组初始值设定项

如果我将Actions.A_ARGS替换为我在Actions{ "paramA", "paramB" }中定义的数组,则错误就会消失......

我的问题是:

  

如何在其他地方定义这个args数组,然后在Annotation中使用它?

2 个答案:

答案 0 :(得分:2)

这在Java中是不可行的。

详情请见此问题:How to supply value to an annotation from a Constant java

最好的办法是将各个数组项定义为常量并重用它们,即

def b58encode(fid):
  CHARS = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
  CHAR_NUM = len(CHARS)
  encoded = ''
  fid = int(fid)

  while fid >= CHAR_NUM:
    div, mod = divmod(fid, CHAR_NUM)
    encoded = CHARS[mod] + encoded
    fid = div
  return CHARS[fid] + encoded

print(b58encode(2222223333333))

然后

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 };

    ...
}

这有助于避免“字符串重复”和拼写错误,但无法解决组合的重复问题。

答案 1 :(得分:1)

您不能将静态数组字段值用作注释的值,因为它不是常量表达式。

请考虑以下示例:

@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() {

}

静态final字符串字段是正确的常量表达式,因为它们无法在运行时更改,因此编译器将它们标记为常量。

静态最终数组字段总是可以在运行时更改,因此compliler不能将其标记为常量。