ClassLoad一个枚举类型

Sna*_*Doc 9 java enums classloader

如何通过ClassLoader或类似机制实例化Enum类型?(我试图将所有内容保存在独立服务器应用程序的相同上下文类加载器下).

我有类似的东西:

ClassLoader loader = new CustomClassLoader(parent, libDir);

Thread.currentThread().setContextClassLoader(loader);

// trouble area
Class<?> containerClass = loader.loadClass("com.somepackage.app.Name$SERVER");
Run Code Online (Sandbox Code Playgroud)

我错误地认为只需加载Enum就足以启动它(它的私有构造函数包含启动方法调用和什么不是).

执行上面的操作不会导致任何异常,但JVM只会在最后一行之后终止,并且服务器无法启动.

显然这样做:

containerClass.newInstance();
Run Code Online (Sandbox Code Playgroud)

抛出异常导致结果.

Rea*_*tic 4

为了扩展我的评论,我认为你会得到的最干净的东西是这样的:

public static <T extends Enum<T>> T loadEnum(ClassLoader loader, String classBinaryName, String instanceName) throws ClassNotFoundException {
    @SuppressWarnings("unchecked")
    Class<T> eClass = (Class<T>)loader.loadClass(classBinaryName);
    return Enum.valueOf(eClass, instanceName);
}
Run Code Online (Sandbox Code Playgroud)

实际上没有办法避免未经检查的强制转换Class<?>为正确的枚举类型。但至少其@SuppressWarnings范围是有限的。


编辑:

经过进一步检查,实际上有一种更简单的方法可以实现您所需的功能,无需知道实例的名称,也不会发出警告:

Class<?> containerClass = loader.loadClass("com.somepackage.app.Name");
containerClass.getEnumConstants()
Run Code Online (Sandbox Code Playgroud)