我试图运行以下代码:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Reflection {
/**
* @param args
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void main(String[] args) throws IllegalAccessException,
InvocationTargetException, IllegalArgumentException {
Class<Cls> cls = Cls.class;
Method[] methods = cls.getMethods();
for (Method m : methods) {
m.invoke(cls);
}
}
}
class Cls {
public static void method1() {
System.out.println("Method1");
}
public static void method2() {
System.out.println("Method2");
}
}
我一直得到一个IllegalArgumentException:错误的参数数量,即使这两个方法不接受参数
我尝试将null
传递给invoke
方法,但这会抛出NPE。
您实际上正确地调用了方法,问题是class . getmethods()方法返回类中的所有方法,包括继承自超类的方法,例如本例中的Object。文档说明:
返回一个包含Method对象的数组,该数组反映由这个class对象表示的类或接口的所有公共成员方法,包括由类或接口声明的方法以及从超类和超接口继承的方法。
在这种情况下,您可能最终调用Object。例如,不带参数的等号。对象也是如此。等待方法等
根据文档:
如果底层方法所需的形式参数的个数为0,则提供的args数组的长度可以为0或null。
你试过这个吗?
m.invoke(cls, null);