我有一个EAR项目结构:




TestDependency.jar


MyInterface.class;

TestEJBModule.jar


ExternalObject.class(实现MyInterface);

测试战争


单身豆
MyTestClass(实现MyInterface);



在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

最佳答案

如果您在兼容的类之间获得了classcast异常,则始终意味着它们已由不同的类加载器加载(很有可能,因为一个在WAR中,另一个在EAR中),或者该类有多个版本,并且错误(不兼容)。 )一个正在被捡起。使用JBoss / Wildfly,后者特别容易发生,因为它具有混乱的类加载策略。

要测试前者,请尝试将类加载器设置为显式加载MyInterface的类加载器:

Class.forName("com.bsssrl.testejbmodule.ExternalObject", true, MyInterface.class.getClassLoader())

关于java - Java反射:创建接口(interface)的新实例并给出java.lang.ClassCastException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40135947/

10-09 03:18