繁体   English   中英

如何通过 Java 枚举 class 名称和字段名称获取值

[英]How to get value by Java enum class name and field name

如何通过 Java 枚举 class 名称和字段名称获取值? 示例代码如下,但不知道如何将枚举class作为参数传递。

public enum ErrorCodes1{
    OK(0),
    NOT_EXIST_USER(1),
    FAIL_TO_SEND_MAIL(2),
    ...
}
public enum ErrorCodes2{
    OK(0),
    NOT_EXIST_USER(1),
    FAIL_TO_SEND_MESSA(2),
    ...
}
public void foo1()
{
    foo2(ErrorCodes1.class, "NOT_EXIST_USER");
    foo2(ErrorCodes2.class, "NOT_EXIST_USER");
}

public void foo2(Enum EnumClass, String EnumText)
{
    int code = xxxx; //I want to get code(1) via EnumText and EnumClass, but I don't know how to do it.
}

您可以使用类型Class作为 function foo2的参数

public static void foo2(Class<?> enumClass, String enumText) {
   int code = -1; // I want to get code(1) via EnumText and EnumClass, but I don't know how to do
                        // it.
    switch (enumClass.getCanonicalName()) {
        case "ErrorCodes2": {
            ErrorCodes1 errorCode = ErrorCodes1.valueOf(enumText);
            code = errorCode.ordinal();
        }
        case "ErrorCodes1": {
            ErrorCodes1 errorCode = ErrorCodes1.valueOf(enumText);
            code = errorCode.ordinal();
        }
    }
    System.out.println(code);
}

之后,您可以使用valueOf从包含枚举值的字符串中实例化您的枚举。 我不认为这是最好的解决方案,但它的作品。

PS: function 的参数以小写字母开头。

选项 A,简单:显式检查类型。

int code;
if (enumClass instanceof ErrorCodes1) {
   code = ((ErrorCodes1) enumClass).valueOf(enumText).ordinal();
} else if (enumClass instanceof ErrorCodes2)
   // repeat

这意味着您可以传递错误 object 本身,而不一定是其 class。 不幸的是, switch不适用于 Class 类型。

选项 B,可能矫枉过正:使用反射。

public void foo2(Class<?> enumClass, String enumText) {
   try{
      Object resultingEnum = enumClass.getMethod("valueOf", String.class).invoke(null, enumText);
      int code = (Integer) resultingEnum.getClass().getMethod("ordinal").invoke(resultingEnum);
      // ...
   } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e ) {
      // ignore: enumClass is not an expected class
   }
}

如果您有无限数量的 ErrorCode 枚举,这将适合您,尽管这是一个几乎不合理的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM