首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClassLoad和Enum类型

ClassLoad和Enum类型
EN

Stack Overflow用户
提问于 2015-01-20 20:05:57
回答 2查看 1.9K关注 0票数 9

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

我有这样的东西:

代码语言:javascript
复制
ClassLoader loader = new CustomClassLoader(parent, libDir);

Thread.currentThread().setContextClassLoader(loader);

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

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

执行上面的操作不会导致任何异常,但是JVM只是在最后一行之后终止,服务器没有启动。

显然在做:

代码语言:javascript
复制
containerClass.newInstance();

结果会引发异常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-20 21:20:14

关于我的评论,我想你能得到的最干净的东西是这样的:

代码语言:javascript
复制
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的范围是有限的。

编辑:

在进一步检查之后,实际上有一种更简单的方法可以实现所需的功能,而不需要知道实例的名称,也不需要警告:

代码语言:javascript
复制
Class<?> containerClass = loader.loadClass("com.somepackage.app.Name");
containerClass.getEnumConstants()
票数 4
EN

Stack Overflow用户

发布于 2015-01-20 20:48:34

加载枚举不会导致初始化。您必须通过字段引用或方法引用来引用它。因此,即使是像Name name = Name.SERVER;Name.SERVER.name();这样的简单语句也能做到这一点。

请参阅Java规范第5.加载、链接和初始化章中的5.5初始化部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28054222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档