2016-07-22 7 views
4

Привет всем, я пытаюсь получить доступ к значению перечисления, присутствующего во внутреннем классе, как показано ниже, но то, что я получаю, - это не значение, а ключ , Потребность в моем приложении заключается в том, что мне нужно получить доступ к этому значению с помощью рефлексии.Как получить значение enum, присутствующего во внутреннем классе с помощью 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")); 
} 

}

На этом я получаю "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()); 

BTW, в перечислении никогда не должно быть сеттера, и value всегда должен быть final — Константы перечисления являются общими одноточечными.