大家好我试图访问内部类中存在的枚举值,如下所示,但我得到的不是值而是键.我的应用程序的需要是我必须通过反射访问此值.
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 – 枚举常量是共享的单例.