我有一个名为
的班级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已经实现了服务?我该如何解决这个问题?
答案 0 :(得分:3)
您尝试在字符串对象setService
上调用"setService"
。 Method#invoke
的第一个参数是调用方法的对象,而不是方法的名称(它已经知道它是谁)。
你想:
method.invoke(bean, myService);
...其中bean
是Class
对象beanClass
引用的类的实例。
答案 1 :(得分:2)
反射不是抱怨的Service
参数,它是第一个参数。实际上,您的代码会尝试执行此操作:
"setService".setService(myService);
由于显而易见的原因无效。
将要设置服务的对象作为第一个参数传递以解决此问题:
method.invoke(instanceOfBeanClass, myService);