访问遗留代码中的私有枚举

时间:2014-08-01 08:57:29

标签: java enums

我有遗留代码,其中是私有枚举,我需要构建另一种类型进行验收测试,但我被卡住了,因为这个枚举是私有的,它不属于任何类,如下所示:

enum Element {
    ELEMENT1, ELEMENT2;

    public static Element[] values() { /* compiled code */ }

    public static Element valueOf(java.lang.String name) { /* compiled code */ }

    private Element() { /* compiled code */ }
}

有没有办法如何使用这个枚举,从遗留代码中公开它,或者可能如何模拟它?

更新: 我知道我可以通过反射读取值枚举,但我有另一个公共的类,我需要在它的构造函数中使用枚举值,这个类与Element在同一个包中,它的构造函数是:

public class ElementProvider {
   public ElementProvider(string name, Element element){ /*compiled code*/ }
} 

1 个答案:

答案 0 :(得分:6)

执行此操作的方法可能是使用Class.forName并使用包+名称加载它。

例如:

Class<?> enumElement = Class.forName("com.my.package.Element");

然后,如果一切正常,你将获得枚举。

然后使用getEnumConstants,您可以阅读枚举的所有常量(如果需要,您可以检查它是否为使用isEnum的枚举):

Object[] enumElements = elements.getEnumConstants();

for (Object obj : enumElements) {
    System.out.println(obj);
}

您被迫使用Object,因为您不知道它将是什么类型(嗯,您知道但无法访问它)

并使用enumElements[0]访问ELEMENT1,依此类推。


关于您更新的问题,这是我脑海中的第一件事:

Class<?> enumElement = Class.forName("org.myname.test.Element");
Object[] enumElements = elements.getEnumConstants();

Object element1 = enumElements[0];

ElementProvider elementProvider = ElementProvider.class.getDeclaredConstructor(String.class, enumElement).newInstance("Hello", element1);
相关问题