java如何在内部使用类?

时间:2017-02-04 18:39:03

标签: java jar

首先,我将描述envir:

我有

的jar存档
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;
    } 
};

我还有

的当前应用
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 B调用setA(它接受jar com.stackoverflow.test.A)并从app中作为参数com.stackoverflow.test.A推送时获得NoSuchMethodException。当我将jar B方法定义更改为接受Object作为参数并尝试将AImpl转换为jar A时,它表示ClassCastException。

我的问题:jar中的A与app A不同吗?如果是的话 - 在这种情况下我该怎么办?

我的目标 - DI使用外部罐子。

如果有帮助 - 我曾经从jar加载类的lib就在这里https://github.com/kamranzafar/JCL

2 个答案:

答案 0 :(得分:0)

更改类型调用后,您是否也这样做了?

对象obj

B obj

由于反射是指Object.class,因为obj变量的数据类型是Object类型,它将获得NoSuchMethodException。

解决方案应该是将数据类型更改为Obj变量的B并检查。

答案 1 :(得分:0)

解决方案:

  1. 在外部jar中包装界面
  2. 将此jar用作B和主应用程序的库