繁体   English   中英

Method.invoke抛出java.lang.IllegalArgumentException:参数数量错误

[英]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.lengthi<=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM