2016-09-15 116 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指類的一個實例。

相關問題