当传入在java reflect中实现接口的类时发生IllegalArgumentException

当传入在java reflect中实现接口的类时发生IllegalArgumentException,java,class,reflection,interface,Java,Class,Reflection,Interface,我有一门课叫 ServiceImpl 这意味着接口 Service 我想调用另一个jar中的一个方法,但需要 Service 作为输入。方法如下: public void setService(Service service) { context.setService(service); } 我尝试使用反射来调用此方法 final ServiceImpl myService = new ServiceImpl(param1, param2); method = beanC

我有一门课叫

ServiceImpl 
这意味着接口

Service
我想调用另一个jar中的一个方法,但需要

Service
作为输入。方法如下:

 public void setService(Service service) {
    context.setService(service);
}
我尝试使用反射来调用此方法

final ServiceImpl myService = new ServiceImpl(param1, param2);


method = beanClass.getMethod("setService",Service.class);

method.invoke("setService", myService);
但是我得到了一个错误:

Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class

这意味着它需要一个服务类,但我正在传入一个ServiceImpl类型的对象。但既然ServiceImpl已经实现了服务,为什么这会成为一个问题呢?如何解决此问题?

您试图对字符串对象调用
setService
“setService”
”s的第一个参数是调用方法的对象,而不是方法的名称(它已经知道它是谁)

你想要:

method.invoke(bean, myService);

…其中
bean
是其
class
对象
beanClass
所引用的类的实例。

反射所抱怨的不是
服务
参数,而是第一个参数。实际上,您的代码尝试这样做:

"setService".setService(myService);
因为明显的原因,它不起作用

传递要将服务设置为第一个参数的对象以解决此问题:

method.invoke(instanceOfBeanClass, myService);

我本该想到这样有效地打电话的,好极了。