【发布时间】:2015-01-21 06:16:56
【问题描述】:
如何通过 ClassLoader 或类似机制实例化 Enum 类型? (我试图将所有内容都保存在独立服务器应用程序的相同上下文类加载器下)。
我有类似的东西:
ClassLoader loader = new CustomClassLoader(parent, libDir);
Thread.currentThread().setContextClassLoader(loader);
// trouble area
Class<?> containerClass = loader.loadClass("com.somepackage.app.Name$SERVER");
我错误地认为只需加载 Enum 就足以启动它(它的私有构造函数包含启动方法调用等等)。
执行我上面的操作不会导致任何异常,但是 JVM 只是在最后一行之后终止并且服务器没有启动。
显然在做:
containerClass.newInstance();
导致抛出异常。
【问题讨论】:
-
为了避免所有的反射,我会启动一个线程,它使用你新的 ClassLoader 并且其中的所有代码都应该是自然的。
-
@PeterLawrey 你是什么意思?自定义类加载器是它自己的 jar 中引导过程的一部分,它为类路径找到所有必要的库并执行一些其他逻辑,然后启动主服务器应用程序(在另一个 jar 中)。
-
您可以访问枚举类代码吗?您可能必须显式编写公共构造函数。
-
您是否尝试使用
Enum.valueOf( containerClass, "name of an instance")? -
请注意,我找到了一个更简单的解决方案并将其添加到我的答案中。
标签: java enums classloader