2011-08-18 39 views
-1

我有這樣Java反射不正常

final Method method = XYZClass.class.getDeclaredMethod(METHOD_NAME, new Class[] {List.class, List.class}); 
method.setAccessible(true); 
final List<Integer> output = (List<Integer>) method.invoke(METHOD_NAME, new Object[] {inputRecords, foo}); 

inputRecords代碼爲對象的列表和foo是一個對象。

我得到的對象不是一個聲明類的實例。

+0

如果foo是一個對象(即不是List的一個實例),方法調用(一旦用Jon Skeet的建議修復)將引發異常。 –

+0

反射*是*正常工作,您錯誤地使用它,您的method.invoke()語句具有錯誤的第一個參數。 –

回答

4

您正試圖在方法名稱(即字符串)上調用方法。你應該調用它的引用的XYZClass一個實例:

XYZClass xyz = ...; 
final List<Integer> output = (List<Integer>) method.invoke(xyz, 
            new Object[] {inputRecords, foo}); 

如果它是一個靜態方法,使用null作爲第一個參數。

+0

whats xyz in invoke ..?以及我如何在XYZClass的實例上調用它....我對relection不太瞭解。 –

+1

@Saurabh:它是對XYZClass實例的引用。基本上你試圖調用在XYZClass中聲明的方法。如果這是一個實例方法,那麼您已*獲得*擁有XYZClass的實例...您會如何期望它能夠正常工作?如果你能解釋你想要做什麼 - 這是否真的有所幫助 - 以及你嘗試調用的方法是否是靜態方法。 –

+0

沒有我調用的方法不是靜態方法。 –