Java 引用注释中枚举中的值?

Java 引用注释中枚举中的值?,java,enums,java-ee-7,Java,Enums,Java Ee 7,我已经写了我的自定义注释,如果我按照下面的方式使用它,它工作得很好 @MyAnnotation("sun") public void getResult(String id){ } public enum WeekDay{ SUNDAY("sun"), MONDAY("mon"); private String day; WeekDay(String day) { this.day= day; } public String

我已经写了我的自定义注释,如果我按照下面的方式使用它,它工作得很好

@MyAnnotation("sun")
public void getResult(String id){


}
public enum WeekDay{

    SUNDAY("sun"), MONDAY("mon");

    private String day;

    WeekDay(String day) {
        this.day= day;
    }


    public String getDay() {
        return this.day;
    }

}
@MyAnnotation(WeekDay.SUNDAY.getDay())
    public void getResult(String id){


    }
MyAnnotation.java 以上代码运行良好。现在,我不想硬编码“sun”,而是将其保存在一个枚举中,如下所示

@MyAnnotation("sun")
public void getResult(String id){


}
public enum WeekDay{

    SUNDAY("sun"), MONDAY("mon");

    private String day;

    WeekDay(String day) {
        this.day= day;
    }


    public String getDay() {
        return this.day;
    }

}
@MyAnnotation(WeekDay.SUNDAY.getDay())
    public void getResult(String id){


    }
现在在注释中,我做如下操作

@MyAnnotation("sun")
public void getResult(String id){


}
public enum WeekDay{

    SUNDAY("sun"), MONDAY("mon");

    private String day;

    WeekDay(String day) {
        this.day= day;
    }


    public String getDay() {
        return this.day;
    }

}
@MyAnnotation(WeekDay.SUNDAY.getDay())
    public void getResult(String id){


    }
上面的代码给出了eclipse中的编译错误。它表示注释属性MyAnnotation.value的值必须是一个常量表达式。我做错什么了吗


谢谢

所有注释属性都是在编译时计算和设置的。方法getDay()显然必须等到代码实际运行后才能返回值,因此在编译过程中不能使用它来设置

您可以将注释值的类型更改为枚举,然后根据需要提供枚举

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
  Weekday value();
}

@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){
}

但是,如果这意味着要接受更广泛的价值观,那么这可能没有任何意义。

这是行不通的。您可以在这个答案中看到一个解释:

但是,可以将注释定义为仅接受枚举:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    WeekDay value();

}

@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){


}
更改为:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String value();

}
致:

然后像这样使用它:

@MyAnnotation(WeekDay.SUNDAY)
如果将字符串文本传递给当前注释,它也会起作用。将方法标记为final将不起作用,因为final on方法只会阻止您重写它,而不会返回常量值。 例如:


你能给我们看一下注释代码吗?还有,你试过没有.getDay()的WeekDay.SUNDAY吗?Silviu,我编辑了我的问题。我试过你的建议,它说不能从工作日转换为字符串。也许声明getDay()方法是最终的?Jorge,我试过了。还是一样的问题。@Jorge_B检查我的答案,看看为什么它不能在getDay()上与final一起工作