如何在运行时基于后端参数获取枚举文件名?

时间:2019-05-23 06:27:02

标签: java enums

我在Java中有四个枚举文件,例如:A.java,B.java,C.java。 现在我的要求是我有一个参数让我们说filename,如果我得到filename参数为A,它将执行A.java的文件,即A.Red与其他情况类似。 文件名将来自restAPI。

我正在尝试使用接口,即我创建了一个接口并在所有枚举上实现它,并尝试在接口中捕获枚举引用,但是这种方法的问题是我无法创建枚举实例。 这就是我尝试过的:

String enumClassName = "enums.A";   
Class c = Class.forName(enumClassName);
//System.out.println(c.);
Object obj = c.newInstance();
SystemEnums enums = (SystemEnums)obj;
System.out.println(enums.getEnumType().get(0));

在界面中找到SystemEnums。

A.java
enum A{
Red,Blue
}


B.java
enum B{
Yellow,Black
}


C.java
enum C{
Pink,White
}

2 个答案:

答案 0 :(得分:2)

关于某种注册表,该注册表知道所有可用的枚举类型。注册表然后可以具有这样的方法:getEnumByName(String enumName)。

我认为这里实际上并不需要通用接口,因为您可以使用标准枚举。

请参见以下示例:

import java.util.Map;

public class Test {
  public static void main(String[] args) throws ReflectiveOperationException {
    EnumRegistry registry = new EnumRegistry();
    registry.registerEnum(A.class);
    registry.registerEnum(B.class);
    registry.registerEnum(C.class);

    final Enum enumByName = registry.getEnumByName("A");
  }
}

enum A {
  Red,
  Blue
}

enum B {
  Yellow,
  Black
}

enum C {
  Pink,
  White
}

public class EnumRegistry {

  private Map<String, Class<Enum>> registeredEnums = new HashMap<?>();

  public void registerEnum(Class e) {
    registeredEnums.put(e.getName(), e);
  }

  public Enum getEnumByName(String name) throws ReflectiveOperationException {
    final Class<Enum> enumClass = registeredEnums.get(name);
    if (enumClass != null) {
      return enumClass.newInstance();
    } else {
      return null;
    }
  }
}

答案 1 :(得分:0)

如果要从反映的枚举类中获取枚举实例,只需使用values

package x;

public class EnumTest {

    public enum TestEnum {
        A, B, C
    }

    public static void main(String[] args) throws Exception {
        Class<?> enumClass = Class.forName("x.EnumTest$TestEnum");
        Object[] enumInstances = (Object[]) enumClass.getMethod("values").invoke(null);
        for (Object enumInstance : enumInstances) {
            System.out.println(enumInstance);
        }
    }

}

请注意,每次调用值都会创建一个新数组,并且可能会很昂贵。