2016-07-22 21 views
4

Hallo alles Ich versuche, auf den Wert eines Enum in einer inneren Klasse wie unten gezeigt zugreifen abrufen, aber was ich bekomme, ist nicht der Wert, sondern der Schlüssel . Die Notwendigkeit meiner Bewerbung besteht darin, dass ich durch Reflexion auf diesen Wert zugreifen muss.Wie Wert einer Enum in einer inneren Klasse durch Reflection

public class Test{ 
static class TwelveByTwentyFour { 
    public static enum BET_TYPE_NAME { 
     Direct12(12),AllOdd(12),AllEven(12), First12(12), Last12(12); 

    private int value; 
    BET_TYPE_NAME(int value){ 
       this.value = value; 
      } 

      public int getValue() { 
       return value; 
      } 
      public void setValue(int value) { 
       this.value = value; 
      } 
    } 

} 
public static String getBetTypeLength(String gameName,String betType) throws ClassNotFoundException, IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException{ 
     return Class.forName(Test.class.getCanonicalName()+"$"+gameName+"$"+"BET_TYPE_NAME").getDeclaredField(betType).get(null).toString(); 
    } 
public static void main(String[] args) throws IllegalArgumentException, SecurityException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException { 
    System.out.println(getBetTypeLength("TwelveByTwentyFour", "AllEven")); 
} 

}

Auf diese Weise erhalte ich "AllEven" als Ausgabe statt "12". Kann mir bitte jemand helfen, indem Sie mir sagen, wie ich den Wert bekommen kann.

Antwort

1

Du nennst BET_TYPE_NAME.AllEven.toString() und es wird in der übergeordneten Enum Klasse implementiert den gleichen Wert wie BET_TYPE_NAME.AllEven.name() zurückzukehren, damit Sie "AllEven" erhalten.

Um "12" zu bekommen, müssen Sie entweder die toString() innerhalb des BET_TYPE_NAME Enum außer Kraft zu setzen wie:

@Override 
public String toString() { 
    return this.value; 
} 

Oder werfen das Ergebnis Field.get(null) auf die Enum BET_TYPE_NAME und rufen getValue() darauf:

return Integer.toString(((TwelveByTwentyFour.BET_TYPE_NAME) 
     Class.forName(Test.class.getCanonicalName()+"$"+gameName+"$"+"BET_TYPE_NAME") 
       .getDeclaredField(betType).get(null)).getValue()); 

BTW, sollte die Enum nie einen Setter haben und die value sollte immer finalseinEnum-Konstanten sind gemeinsame Singletons.