如何通过反射获取内部 class 中存在的枚举值

How to fetch value of an enum present in an inner class through Reflection

大家好我正在尝试访问内部 class 中存在的枚举的值,如下所示,但我得到的不是值而是键。我的应用程序的需要是我必须通过反射访问这个值。

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"。任何人都可以告诉我如何获得价值来帮助我。

你正在调用 BET_TYPE_NAME.AllEven.toString() 并且它在父 Enum class 中实现为 return 与 BET_TYPE_NAME.AllEven.name() 相同的值,因此你得到"AllEven".

要获得 "12",您需要覆盖 BET_TYPE_NAME 枚举中的 toString(),例如:

@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 应该总是 final — 枚举常量是共享的单例。