为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Constant java为注释提供值

如何从Constant java为注释提供值

呼唤远方 2019-07-30 15:52:50
如何从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 []常量来为注释提供值吗?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

编译常量只能是基元和字符串:

15.28。常数表达式

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

  • 原始类型的文字和类型的文字 String

  • 转换为基本类型和转换为类型 String

  • [...]运营商[...]

  • 括号表达式,其包含的表达式是常量表达式。

  • 引用常量变量的简单名称。

  • TypeName表单的限定名称。引用常量变量的标识符

实际上在java中没有办法保护数组中的项目。在运行时,有人总能这样做FieldValues.FIELD1[0]="value3",因此如果我们看得更深,那么数组就不能真正保持不变。


查看完整回答
反对 回复 2019-07-30
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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

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[]。也许它不喜欢数组是可变的这个事实?嗯...


查看完整回答
反对 回复 2019-07-30
?
ibeautiful

TA贡献1993条经验 获得超5个赞

在示例中,您没有为它提供数组。以下编译正常:

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


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 584 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号