如何通过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();结果会引发异常。
发布于 2015-01-20 21:20:14
关于我的评论,我想你能得到的最干净的东西是这样的:
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);
}确实没有办法避免从Class<?>到适当的枚举类型的未经检查的强制转换。但至少@SuppressWarnings的范围是有限的。
编辑:
在进一步检查之后,实际上有一种更简单的方法可以实现所需的功能,而不需要知道实例的名称,也不需要警告:
Class<?> containerClass = loader.loadClass("com.somepackage.app.Name");
containerClass.getEnumConstants()发布于 2015-01-20 20:48:34
加载枚举不会导致初始化。您必须通过字段引用或方法引用来引用它。因此,即使是像Name name = Name.SERVER;或Name.SERVER.name();这样的简单语句也能做到这一点。
请参阅Java规范第5.加载、链接和初始化章中的5.5初始化部分。
https://stackoverflow.com/questions/28054222
复制相似问题