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

如何从常量java为注释提供值,java,arrays,annotations,Java,Arrays,Annotations,我认为这在Java中是不可能的,因为注释及其参数是在编译时解析的。我有一个如下的界面 public interface FieldValues { String[] FIELD1 = new String[]{"value1", "value2"}; } 另一类是 @SomeAnnotation(locations = {"value1", "value2"}) public class MyClass { .... } 我用注释标记了许多类,我想知道是否可以避免在我更喜欢使用的

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

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

@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
   ....
}
我用注释标记了许多类,我想知道是否可以避免在我更喜欢使用的每个注释中指定字符串

@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
   ....
}
但是,这会产生编译错误,例如注释值应该是数组初始值设定项等。有人知道如何使用字符串常量或字符串[]常量为注释提供值吗

有人知道我怎么用手机吗 字符串常量或字符串[]常量 是否为注释提供值

不幸的是,您不能用数组来实现这一点。对于非数组变量,值必须是最终静态。

您可以使用常量(即静态最终变量)作为注释的参数。举个简单的例子,我经常使用这样的东西:

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\u TIMEOUT
常量直接传递到注释中

顺便说一句,我不记得曾经在数组中尝试过这一点,因此您可能会遇到一些问题,在数组作为注释参数的表示方式与Java变量的表示方式上略有不同?但是对于你问题的另一部分,你可以毫无疑问地使用一个常量字符串


编辑:我刚刚用字符串数组尝试了这个方法,没有遇到您提到的问题-但是编译器告诉我“属性值必须是常量”,尽管数组被定义为
公共静态最终字符串[]
。也许它不喜欢数组是可变的这一事实?嗯…

在您的示例中,您没有为它提供数组。以下内容很好:

public @interface SampleAnnotation {
    String[] sampleValues();
}

public class Values {
    public static final String val0 = "A";
    public static final String val1 = "B";

    @SampleAnnotation(sampleValues={ val0, val1 })
    public void foo() {
    }
}
编译常量:

15.28。常量表达式

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

  • 原语类型的文字和
    字符串类型的文字
  • 强制转换为基本类型并强制转换为类型
    String
  • […]运算符[…]
  • 包含表达式为常量表达式的括号表达式
  • 引用常量变量的简单名称
  • 表单TypeName的限定名称。引用常量变量的标识符
实际上,在java中,无法保护数组中的项。在运行时,总有人可以执行
FieldValues.FIELD1[0]=“value3”
,因此,如果我们看得更深入一些,数组就不能真正保持不变

我认为这在Java中是不可能的,因为注释及其参数是在编译时解析的

使用Seam 2,您可以在运行时解析注释参数,表达式语言包含在双引号中


在Seam 3中,此功能是模块Seam焊料

您可以使用枚举并在注释字段中引用该枚举

我真倒霉!哦,是的,我能传递字符串/数字,但不能传递数组。我会花更多的时间在这上面,如果没有任何结果,我会接受答案:)是的,我猜FIELD1数组的可变性是这里的问题。您可以使用数组初始值设定项声明数组,因为其他任何东西都无法访问该数组,因此以后无法更改。这解决了我的问题。只需要在注释和代码之间共享一个字符串常量。谢谢静态最终变量不是唯一的先决条件。如果尝试动态计算变量,则会收到相同的错误消息。示例中提供了一个数组,而不是直接在注释声明中创建的数组。@TacB0sS,枚举不是常量表达式。嗯。。。也许你应该试一试,让我知道。。。我一直在使用它们:)一个更相关的规范正在制定中。除了常量表达式之外,注释值还可以是数组初始值设定项、类文字或枚举常量。啊哈!我用的是长的,不是长的。。。。。解决了我的问题!!!谢谢@TacB0sS您可以在注释中使用
enum
,但它们不是编译时常量。当您写入
静态最终EnumType变量=EnumType.ENUM_常量时,差异会变得明显
并尝试在注释中使用
变量
;这行不通。您只能使用
EnumType.ENUM_CONSTANT
,它不是常量表达式,但在批注(和
switch
语句)中特别允许使用。不,您没有在运行时解析参数。参数在编译时解析。它们在运行时被用来做一些事情与它们的值被设置的时间毫无关系。你应该添加一个例子。