我有一个名为
的类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
它说它期望一个Service类,但我传递了一个类型为ServiceImpl的对象。但是,既然ServiceImpl已经实现了Service,为什么这应该是一个问题呢?我该如何解决这个问题?
您试图在字符串对象"setService"
上调用setService
。Method#invoke
的第一个参数是要调用方法的对象,而不是方法的名称(它已经知道它是谁)。
你想:
method.invoke(bean, myService);
…其中,bean
是Class
对象beanClass
所指向的类的实例。
反射所抱怨的不是Service
参数,而是第一个参数。实际上,您的代码会尝试这样做:
"setService".setService(myService);
由于明显的原因不能工作。
传递要在其上设置服务的对象作为解决此问题的第一个参数:
method.invoke(instanceOfBeanClass, myService);