2017-02-04 4 views
0

最初に私がENVIRを説明します:Javaは内部でクラスとどのように連携しますか?

私は

package com.stackoverflow.test; 
public interface A {}; 

------------------------------------------- 
package com.stackoverflow.test; 
public class B { 
    private A a; 
    public void setA(A a) { 
     this.a = a; 
    } 
}; 

とのjarアーカイブを持って、私はジャーBからセットAを起動していたとき、私も(

package com.stackoverflow.test; 
public interface A {}; 
------------------------------------------- 
package com.stackoverflow.test; 
public class AImpl implements A {} 
------------------------------------------- 
package com.stackoverflow.test; 
class TestInvocation { 
    public static void main(String[] args) { 
     ... 
     /* Instance of class B gained via external lib */ 
     Object obj; 
     A a = new AImpl(); 
     try { 
      Method method = obj.getClass().getMethod("setA", A.class); 
      method.invoke(obj, a); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
     ... 
    } 
} 

で現在のアプリを持っていますjar com.stackoverflow.test.Aを受け入れます)、アプリケーションiからパラメータcom.stackoverflow.test.Aをプッシュすると、NoSuchMethodExceptionが取得されます。 jar Bメソッドの定義をObjectとして受け取り、AImplをJar Aにキャストしようとすると、ClassCastExceptionが発生します。

私の質問:JarのAとアプリAの違いはありますか?はいの場合 - 私はこの場合どのようにすることができますか?

私のターゲット - DIは外部ジャーを使用しています。

それが助け場合は - 私はjarファイルからクラスをロードするために使用libには、ここでhttps://github.com/kamranzafar/JCL

答えて

0

解決外部ジャーに

  1. ラップインタフェース
  2. Bとメインアプリ両方
0

であるあなたは、以下のようなタイプの呼び出しを変更した後に同じを得るのですか?

BのOBJ

OBJ

オブジェクトOBJ変数のデータ型がObject型であったので、反射Object.classを参照しているので、それはないNoSuchMethodExceptionを取得します。

解決策は、データ型をObj変数のBに変更してチェックすることです。

+0

B用LIBとして使用このジャーをジャーの一部です。メインアプリではアクセスできません。 – cronzzz

関連する問題