我有一个EAR项目结构:
EAR
TestDependency.jar
TestEJBModule.jar
TestWar
在Singleton bean中我需要使用类名动态地实例化ExternalObject类,但我得到了
Caused by: javax.ejb.EJBException: java.lang.ClassCastException: com.bsssrl.testejbmodule.ExternalObject cannot be cast to com.bsssrl.MyInterface
代码是:
Class localclass = Class.forName("com.bsssrl.test.testwar.MyTestClass");
Object olocal = localclass.newInstance();
MyInterface local = (MyInterface) olocal;
LOG.log(Level.INFO, "Test local.getString() : {0}",local.getString());
LOG.log(Level.INFO, "Test local.getAlfa() : {0}",local.getAlfa());
Class exclass = Class.forName("com.bsssrl.testejbmodule.ExternalObject");
Object oex = exclass.newInstance();
if(MyInterface.class.isAssignableFrom(exclass)){
MyInterface extern = (MyInterface) oex;
LOG.log(Level.INFO, "Test extern.getString() : {0}",extern.getString());
LOG.log(Level.INFO, "Test extern.getAlfa() : {0}",extern.getAlfa());
}else{
LOG.log(Level.SEVERE, "Class {0} not implement MyInterface",exclass);
}
课程是:
public class ExternalObject implements MyInterface{
public Alfa alfa;
@Override
public String getString() {
return "from external object in EJB module";
}
@Override
public Alfa getAlfa() {
return alfa;
}
@Override
public void setAlfa(Alfa a) {
this.alfa = a;
}
}
第一段代码有效,但第二段启动ClassCastException; 我想我的类加载器有问题。
我该如何解决?
PS:我使用wildfly-9.0.2.Final
答案 0 :(得分:1)
如果你在兼容的类之间获得了classcast异常,那么它总是意味着它们已被不同的类加载器加载(非常可能,因为一个在WAR中,另一个在EAR中),或者有多个版本的类可用并且错误的(不相容的)被捡起来了。对于JBoss / Wildfly,后者特别容易发生,因为它有一个混乱的类加载策略。
要测试前者,请尝试将类加载器设置为明确加载MyInterface
的类加载器:
Class.forName("com.bsssrl.testejbmodule.ExternalObject", true, MyInterface.class.getClassLoader())
答案 1 :(得分:0)
我收到了ClassCastException
IService iService=(IService) classS.newInstance();
与
urlClassLoader=URLClassLoader.newInstance(new URL[] {new URL(urlStr)});
然后添加将类加载器强制转换为newInstance的参数,这为我解决了这个问题:
urlClassLoader=URLClassLoader.newInstance(new URL[] {new URL(urlStr)},IService.class.getClassLoader());