与えるインタフェースの新しいインスタンスを作成します。Javaのリフレクション:私はEARプロジェクトの構造をしたとjava.lang.ClassCastException
EAR
TestDependency.jar
- MyInterface.class。
TestEJBModule.jar
- ExternalObject.class(MyInterfaceを実装します)。
TestWar
- SingletonBean
- MyTestClass(MyInterfaceを実装します)。
はシングルトン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;
}
}
最初のコードは動作しますが、2回目の起動ではClassCastExceptionが発生します。 クラスローダーに問題があると思います。
どうすれば解決できますか?
PS:私はあなたが互換性のあるクラス間のclasscast例外を取得した場合は1がWARであるとして、それは常に、非常に高い(彼らは異なるクラスローダによってロードされてきた意味wildfly-9.0.2.Final
はExternalObjectがMyInterfaceを実装しているかどうかを確認してみてください。 –
@RayLloy私は質問にチェックを追加するコードを変更しました... ExternalObjectがMyInterfaceを実装していてもチェックが失敗します –
私はJavaアプリケーションと同じテストを行いました。変更後にTestEJBModule.jarをビルドしてもよろしいですか? –