有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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.
}

共 (2) 个答案

  1. # 1 楼答案

    您可以使用Class<>作为函数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:函数的参数以小写字母开头

  2. # 2 楼答案

    选项A,简单:明确检查类型

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

    这意味着您可以传递错误对象本身,而不必传递其类。不幸的是,switch不适用于类类型

    选项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
       }
    }
    

    这将适合您的情况下,您有一个无限数量的错误代码枚举,虽然这是一个勉强合理的情况