2016-09-15 119 views
3

我有一个名为抛出:IllegalArgumentException反映

ServiceImpl 

类implents接口

Service 

我在另一个罐的方法,其欲通话但需要

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已经实施了服务?我该如何解决这个问题?

回答

2

反射所抱怨的并不是Service参数,它是第一个参数。实际上,您的代码尝试执行此操作:

"setService".setService(myService); 

这不起作用的原因很明显。

通过,要设置服务作为第一个参数来解决这个问题的对象:

method.invoke(instanceOfBeanClass, myService); 
+0

我应该想到,显示有效呼叫这样,好一个。 –

3

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

你想:

method.invoke(bean, myService); 

...其中bean是其Class对象beanClass指类的一个实例。

相关问题