2017-12-15 7 views
0

Ich versuche, alle ENUM-Werte einer bestimmten Enum-Klasse zur Laufzeit durchzuschleifen und zu drucken. Aber ich kann nur die den Werten zugeordneten Konstanten zurückgeben. Die meisten Lösungen verweisen auf die Verwendung von getEnumConstants(), values ​​() oder valueOf(), aber ich konnte sie nicht wie gewünscht zum Laufen bringen.Numerischer Wert mit Reflektion erhalten

Die nächsten Fragen, die ich finden konnte, sind Get value of enum by reflection und how-to-get-all-enum-values-in-java, aber sie sind anscheinend unterschiedlich genug, dass die Lösungen nicht meinen Anforderungen entsprachen. Unten ist der Code, den ich versucht habe und die ENUM-Klasse, die erzeugt automatisch und unveränderlich:

Class cls = Class.forName("TestEnum"); 
for (Object obj : cls.getEnumConstants()) 
{ 
    System.out.println(obj.toString()); //prints TEST___A (not TEST_1) 
    System.out.println(Enum.valueOf(cls, obj.toString())); //prints TEST___A (not TEST_1) 
} 

und die ENUM:

@XmlType(name = "TestEnum") 
@XmlEnum 
public enum TestEnum { 

    @XmlEnumValue("TEST_1") 
    TEST___A("TEST_1"), 
    @XmlEnumValue("TEST_2") 
    TEST___B("TEST_2"); 
    private final String value; 

    TestEnum(String v) { 
     value = v; 
    } 

    public String value() { 
     return value; 
    } 

    public static TestEnum fromValue(String v) { 
     for (TestEnum c: TestEnum.values()) { 
      if (c.value.equals(v)) { 
       return c; 
      } 
     } 
     throw new IllegalArgumentException(v); 
    } 

gewünschte Ausgabe:

TEST_1 
TEST_2 

tatsächliche Ausgang:

TEST___A 
TEST___B 

Vielleicht wäre das einfacher, wenn ich verstehe, was diese automatisch generierten Klassen machen und wofür sie sind?

Antwort

0

Schließlich wurde es:

Class cls = Class.forName("TestEnum"); 
    for (Object obj : cls.getEnumConstants()) 
    { 
     try 
     { 
      Method m = cls.getMethod("value", null); 
      System.out.println(m.invoke(obj, null)); 
     } 
     catch(NoSuchMethodException | IllegalAccessException | 
       InvocationTargetException ex){System.out.println("could not find enum");} 
0

Vielleicht so etwas (keine Reflexion erforderlich):

enum MyEnum { 
    TEST____1("TEST_1"), 
    TEST____2("TEST_2"); 

    final String value; 

    MyEnum(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 
} 

public void test(String[] args) { 
    for (MyEnum e : MyEnum.class.getEnumConstants()) { 
     System.out.println(e.toString() + " - " + e.getValue()); 
    } 
} 

oder sogar

enum MyEnum { 
    TEST____1("TEST_1"), 
    TEST____2("TEST_2"); 

    final String value; 

    MyEnum(String value) { 
     this.value = value; 
    } 

} 

public void test(String[] args) { 
    for (MyEnum e : MyEnum.class.getEnumConstants()) { 
     System.out.println(e.toString() + " - " + e.value); 
    } 
} 
+0

Ich werde nicht die Enum Namen kennen, bis es Aus einer Konfigurationsdatei zur Laufzeit lesen. Es muss dynamisch sein. Das Programm erzeugt automatisch Enum-Optionen in über 50 verschiedenen Textfeldern, die mit den Optionen von 50 verschiedenen Enums verknüpft sind. – JavaBeast

Verwandte Themen