首先,我将描述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
答案 0 :(得分:0)
更改类型调用后,您是否也这样做了?
对象obj
B obj
由于反射是指Object.class,因为obj变量的数据类型是Object类型,它将获得NoSuchMethodException。
解决方案应该是将数据类型更改为Obj变量的B并检查。
答案 1 :(得分:0)
解决方案: