一尘不染

如何从常量 java 为注解提供值

javascript

我认为这在 Java 中可能是不可能的,因为注释及其参数是在编译时解析的。我有一个如下界面,

public interface FieldValues {
   String[] FIELD1 = new String[]{"value1", "value2"};
}

和另一个类,

@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
   ....
}

我用注释标记了许多类,我想知道是否可以避免在我更喜欢使用的每个注释中指定字符串

@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
   ....
}

但是,这会产生编译错误,例如注释值应该是数组初始值设定项等。有人知道我如何使用 String 常量或 String[] 常量为注释提供值吗?


阅读 160

收藏
2022-05-09

共1个答案

一尘不染

编译常量只能是原语和字符串

15.28。常量表达式

编译时常量表达式是表示原始类型值或字符串的表达式,它不会突然完成并且仅使用以下内容组成:

  • 原始类型的文字和类型的文字String
  • 转换为原始类型和转换为类型String
  • […] 运营商 […]
  • 带括号的表达式,其包含的表达式是常量表达式。
  • 引用常量变量的简单名称。
  • TypeName形式的限定名称。引用常量变量的标识符。

实际上在java中没有办法保护数组中的项目。在运行时总是有人可以做FieldValues.FIELD1[0]="value3"的,因此如果我们深入研究,数组不可能是真正的常数。

2022-05-09