我有遗留代码,其中是私有枚举,我需要构建另一种类型进行验收测试,但我被卡住了,因为这个枚举是私有的,它不属于任何类,如下所示:
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*/ }
}
答案 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);