我已经编写了自定义注释,如果按照以下方式使用它,工作正常。
@MyAnnotation("sun")
public void getResult(String id){
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
上面的代码工作正常。现在我不想硬编码“太阳”,而是将它保存在Enum中,如下所示。
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的值必须是常量表达式。我在这里做错了吗?
谢谢!
答案 0 :(得分:1)
更改自:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
要:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
WeekDay value();
}
并像这样使用它:
@MyAnnotation(WeekDay.SUNDAY)
如果将字符串文字传递给当前注释,它也会起作用。将方法标记为final将不起作用,因为final on methods仅阻止您覆盖它,而不是返回常量值。 例如:
public final String getString() {
String[] strings = { "A", "B" };
return strings[new Random().nextInt(2)]; // returned value is not the same
}
答案 1 :(得分:0)
在编译时评估和设置所有注释属性。方法getDay()显然必须等到代码实际运行才能返回一个值,所以在编译期间你不能用它来设置东西!
您可以将注释值的类型更改为枚举,然后根据需要提供枚举。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
Weekday value();
}
@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){
}
但如果它意味着接受更广泛的价值观,那可能没有任何意义。
答案 2 :(得分:0)
它无效。您可以在此答案中看到解释:https://stackoverflow.com/a/3272859/1912167
但是,您可以将注释定义为仅接受枚举:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
WeekDay value();
}
@MyAnnotation(WeekDay.SUNDAY)
public void getResult(String id){
}