当传入在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);
我本该想到这样有效地打电话的,好极了。