2016-10-19 10 views
0

与えるインタフェースの新しいインスタンスを作成します。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

+2

はExternalObjectがMyInterfaceを実装しているかどうかを確認してみてください。 –

+0

@RayLloy私は質問にチェックを追加するコードを変更しました... ExternalObjectがMyInterfaceを実装していてもチェックが失敗します –

+0

私はJavaアプリケーションと同じテストを行いました。変更後にTestEJBModule.jarをビルドしてもよろしいですか? –

答えて

1

を使用もう1つはEARにあります)、利用可能なクラスが複数あり、間違った(互換性のない)バージョンが選択されています。 JBoss/Wildflyを使用すると、混乱したクラスローディング戦略があるため、後者は特に簡単に実行できます。明示的MyInterfaceをロードしたときと同じものにクラスローダを設定してみてください、元をテストするために

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

Tryed、私は同じエラーを受け取ります: 'ClassLoader clInterfaccia = MyInterface.class.getClassLoader(); localclass = Class.forName(クラス名、true、clInterfaccia); olocal = localclass.newInstance(); if(MyInterface.class.isAssignableFrom(localclass)) - > false' –

関連する問題