传递一个在java中实现接口的类的IllegalArgumentException

时间:2016-09-15 10:07:35

标签: java class reflection interface

我有一个名为

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

2 个答案:

答案 0 :(得分:3)

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

你想:

method.invoke(bean, myService);

...其中beanClass对象beanClass引用的类的实例。

答案 1 :(得分:2)

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

"setService".setService(myService);

由于显而易见的原因无效。

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

method.invoke(instanceOfBeanClass, myService);