我正在尝试使用与枚举值相关联的注释字符串值,以获取对相关枚举值的引用。
我最终陷入困境......目前我有以下开发代码:
注释码:
public @interface MyCustomAnnotation{
String value();
}
枚举代码:
public enum MyEnum{
@MyCustomAnnotation("v1")
VALUE1,
@MyCustomAnnotation("v2")
VALUE2,
@MyCustomAnnotation("v3")
VALUE3,
}
使用枚举注释:
String matchString = "v1";
MyEnum myEnumToMatch;
// First obtain all available annotation values
for(Annotation annotation : (MyEnum.class).getAnnotations()){
// Determine whether our String to match on is an annotation value against
// any of the enum values
if(((MyCustomAnnotation)annotation).value() == matchString){
// A matching annotation value has been found
// I need to obtain a reference to the corrext Enum value based on
// this annotation value
for(MyEnum myEnum : MyEnum.values()){
// Perhaps iterate the enum values and obtain the individual
// annotation value - if this matches then assign this as the
// value.
// I can't find a way to do this - any ideas?
myEnumToMatch = ??
}
}
}
提前致谢。
答案 0 :(得分:4)
在枚举中有一个字段会更容易,如下所示:
public enum MyEnum {
VALUE1("v1"),
VALUE2("v2"),
VALUE3("v3");
private String displayValue;
private MyEnum(string s) {
this.displayValue = s;
}
public String getDisplayValue() {
return displayValue;
}
}
然后在你的匹配循环中,你只需遍历MyEnum.values()
并寻找具有正确displayValue的那个。
答案 1 :(得分:2)
我完全同意@MichaelMyers的说法,最好在枚举中添加一个值,而不是使用注释。但是,下面的代码可以帮助您了解注释如何附加到枚举值。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
String value();
}
public enum Example {
@MyAnno("v1") FOO,
@MyAnno("v2") BAR,
@MyAnno("v3") BAZ
}
public static void main(String[] argv)
throws Exception {
for (Field field : Example.class.getDeclaredFields()) {
System.out.println(field.getName());
for (Annotation anno : field.getAnnotations()) {
if (anno instanceof MyAnno) {
MyAnno myAnno = (MyAnno)anno;
System.out.println(" anno = " + myAnno.value());
}
}
}
}
答案 2 :(得分:1)
枚举常量是enum
类的常规字段,因此您必须通过反射访问它们:
for (Field enumValue : MyEnum.class.getDeclaredFields()) {
MyAnnotation annotation = enumValue.getAnnotation(MyAnnotation.class);
if (annotation != null) {
System.out.printf("Field '%s' is annotated with @MyAnnotation with value '%s'\n",
enumValue.getName(),
annotation.value());
} else {
System.out.printf("Field '%s' is not annotated with @MyAnnotation\n", enumValue.getName());
}
}
请注意,这还包括一个名为$VALUES
的内部字段,其中包含一个包含所有枚举值的数组。您可以使用例如过滤if (enumValue.isSynthethic()) { ... }
。