【问题标题】:How to fetch value of an enum present in an inner class through Reflection如何通过反射获取内部类中存在的枚举的值
【发布时间】:2016-07-22 06:05:19
【问题描述】:

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

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

【问题讨论】:

    标签: java class reflection enums inner-classes


    【解决方案1】:

    您正在调用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,value 应该始终是 final — 枚举常量是共享单例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多