java – 如何通过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”.任何人都可以通过告诉我如何获得价值来帮助我.

最佳答案 您正在调用BET_TYPE_NAME.AllEven.toString(),它在父Enum类中实现,以返回与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,值应该总是final – 枚举常量是共享的单例.

点赞