[英]Using method.invoke Exception in thread “main” java.lang.IllegalArgumentException: wrong number of arguments
[英]Method.invoke throws java.lang.IllegalArgumentException: wrong number of arguments
public class ReflectionTest {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
// TODO Auto-generated method stub
ReflectionTest t = new ReflectionTest();
Method method[]= t.getClass().getMethods();
System.out.println(method.length);
for(int i=0;i<=method.length;i++){
method[i].invoke(t);
}
}
public void abc(){
System.out.println("abc");
}
public void xyz(){
System.out.println("XYZ");
}
}
结果显示:
abc
xyz
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.selenium.test.ReflectionTest.main(ReflectionTest.java:21)
请帮我如何处理
该错误是因为与abc()和xyz()一起,存在许多其他方法。
equals
hashCode
toString
abc
xyz
getClass
notify
notifyAll
wait
如果要运行方法,可以使用以下逻辑
for(int i=0;i<method.length;i++){
if(method[i].getName().equals("abc") || method[i].getName().equals("xyz"))
{
method[i].invoke(t);
}
}
如果我理解您的问题,则需要跳过调用main
(因为它需要String[] args
)和Object
其他方法,即
ReflectionTest t = new ReflectionTest();
Method method[] = t.getClass().getMethods();
System.out.println(method.length);
for (int i = 0; i < method.length; i++) {
if (method[i].getName().equals("abc") || method[i].getName().equals("xyz")) {
try {
method[i].invoke(t, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
似乎在这里正常工作。
问题出在
for(int i=0;i<=method.length;i++){
method[i].invoke(t);
}
您迭代直到i
具有与method.length相同的值。 因为数组以0开头,并且method.length从1开始计数。
您必须迭代直到i<method.length
或i<=method.length-1
例如。
method []有一项。
method[0] <- first and only item
method.length <- will return 1 becuase there is only one item.
你可以说:
method[method.length-1] <- this will be the last item.
再想想你在做什么。 您遍历类中所有可用的公共方法(包括在超类中声明的方法),并尝试在不带参数的情况下调用,即,假定所有方法均不接受任何绝对错误的参数。 例如,从java.lang.Object
继承的equals(Object)
或wait(long)
需要一个参数。
编辑
关于您自己的方法main(String[])
。
有时getMethods()
返回前两个不需要参数的方法: abc()
和xyz()
成功调用。 然后main()
轮到,您将失败。 但是,即使您添加了一些if()
语句来忽略main
您也会在从我已经提到的Object
继承的方法之一上失败。
如果只想尝试在类中声明的方法,请使用getDeclaredMethods()
而不是getMethods()
。
当您尝试调用需要参数而不提供任何参数的方法时,将发生错误。
对于一般的解决方案,您可能需要测试一下:
if (method[i].getParameterTypes().length ==0)
{
method[i].invoke(t);
}
这测试方法是否具有参数并跳过它
看这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.