2016-07-22 198 views
4

你好我正試圖訪問內部類中存在的枚舉的值,如下所示,但我得到的不是值,而是鍵。我的應用程序的需要是我必須通過反思來訪問這個值。如何通過反射獲取內部類中存在的枚舉的值

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")); 
} 

}

在這樣做我得到"AllEven"輸出,而不是"12"。任何人都可以請告訴我,我該如何獲得價值。

回答

1

您打電話給BET_TYPE_NAME.AllEven.toString(),它在父類Enum類中實現,以返回與BET_TYPE_NAME.AllEven.name()相同的值,因此您獲得"AllEven"

要獲得"12",您可能需要重寫toString()BET_TYPE_NAME枚舉內,如:

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

或澆鑄的Field.get(null)結果到枚舉BET_TYPE_NAME,並呼籲getValue()它:

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

順便說一句,枚舉不應該有一個setter和value應始終是最後 —枚舉常量是共享的單例。