2011-08-18 48 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

没有我调用的方法不是静态方法。 –