2013-02-21 3 views
1

Я пытаюсь использовать значение строки аннотации, связанное с значениями перечисления, чтобы получить ссылку на связанное значение перечисления.Получить значение enum через значение аннотации в Java

Я в конечном итоге застрять в середине пути ... В настоящее время у меня есть код ниже разработки:

Аннотация Код:

public @interface MyCustomAnnotation{ 
    String value(); 
} 

Enum код:

public enum MyEnum{ 
    @MyCustomAnnotation("v1") 
    VALUE1, 
    @MyCustomAnnotation("v2") 
    VALUE2, 
    @MyCustomAnnotation("v3") 
    VALUE3, 
} 

Making использование аннотации перечисления:

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 = ?? 
     } 
    } 
} 

Заранее спасибо.

+2

Вы не можете работать с 'MyEnum.values ​​()', потому что аннотации привязаны к элементам кода, а не к экземплярам объектов. Вам нужно будет использовать отражение для доступа к статическим полям MyEnum, которые хранят константы значения enum. Также 'MyEnum.class.getAnnotations()' ничего не вернет, потому что сам класс MyEnum не аннотируется ничем, поэтому цикл не будет работать. – millimoose

+0

Вы действительно уволили свой код в отладчике, чтобы на самом деле высунуть состояние программы и посмотреть, какие значения возвращаются ?! – millimoose

+1

Какая последняя необходимость? – Aerospace

ответ

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.

+0

Это именно то, что мне нужно, и хорошее решение, спасибо большое. – Mojo

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()); 
      } 
     } 
    } 
} 
1

Enum постоянные регулярные поля 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()) { ... }.