如何从Constant java为注释提供值

如何从Constant java为注释提供值

我认为这在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 []常量来为注释提供值吗?



呼唤远方
浏览 585回答 3
3回答

浮云间

编译常量只能是基元和字符串:15.28。常数表达式编译时常量表达式是表示基本类型的值的表达式或不突然完成的字符串,仅使用以下内容组成:原始类型的文字和类型的文字 String转换为基本类型和转换为类型 String[...]运营商[...]括号表达式,其包含的表达式是常量表达式。引用常量变量的简单名称。TypeName表单的限定名称。引用常量变量的标识符。实际上在java中没有办法保护数组中的项目。在运行时,有人总能这样做FieldValues.FIELD1[0]="value3",因此如果我们看得更深,那么数组就不能真正保持不变。

海绵宝宝撒

您可以使用常量(即静态的最终变量)作为注释的参数。作为一个简单的例子,我经常使用这样的东西:import org.junit.Test;import static org.junit.Assert.*;public class MyTestClass{     private static final int TEST_TIMEOUT = 60000; // one minute per test     @Test(timeout=TEST_TIMEOUT)     public void testJDK()     {         assertTrue("Something is very wrong", Boolean.TRUE);     }}请注意,可以将TEST_TIMEOUT常量直接传递给注释。另外,我不记得曾经用数组试过这个,所以你可能会遇到一些问题,与Java变量相比,数组如何表示为注释参数?但至于问题的其他部分,你绝对可以使用一个常量String而没有任何问题。编辑:我刚刚尝试使用String数组,并没有遇到你提到的问题 - 但编译器确实告诉我“属性值必须是常量”,尽管数组被定义为public static final String[]。也许它不喜欢数组是可变的这个事实?嗯...

ibeautiful

在示例中,您没有为它提供数组。以下编译正常:   public @interface SampleAnnotation {         String[] sampleValues();     }     public class Values {         public static final String v1 = "A";         public static final String v2 = "B";         @SampleAnnotation(sampleValues = { v1, v2 })         public void foo() {         }     }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java