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

Mar*_*cky 2 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 */ }
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class ElementProvider {
   public ElementProvider(string name, Element element){ /*compiled code*/ }
} 
Run Code Online (Sandbox Code Playgroud)

Mar*_*rno 6

一种方法是使用Class.forName包+名称来使用和加载它.

例如:

Class<?> enumElement = Class.forName("com.my.package.Element");
Run Code Online (Sandbox Code Playgroud)

然后,如果一切正常,你将拥有枚举.

然后getEnumConstants你可以读取枚举的所有常量(如果需要,你可以检查它是否是枚举isEnum):

Object[] enumElements = elements.getEnumConstants();

for (Object obj : enumElements) {
    System.out.println(obj);
}
Run Code Online (Sandbox Code Playgroud)

您被迫使用,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);
Run Code Online (Sandbox Code Playgroud)