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

时间:2014-07-02 07:03:59

标签: java

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)

请帮我解决这个问题

5 个答案:

答案 0 :(得分:3)

错误是因为除了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);
    }

}

答案 1 :(得分:1)

如果我理解了您的问题,则需要跳过调用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();
    }
  }
}

似乎在这里正常工作。

答案 2 :(得分:0)

问题在于

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[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.

答案 3 :(得分:0)

再想一想你在做什么。 迭代你的类中可用的所有公共方法(包括在超类中声明的方法)并尝试不带参数调用,即假设所有方法都不接受任何绝对错误的参数。例如,从equals(Object)继承的wait(long)java.lang.Object需要一个参数。

修改

同样是关于你自己的方法main(String[])

偶尔getMethods()会返回前两个不需要参数的方法:成功调用abc()xyz()。然后转向main()到达而你失败了。但即使你添加一些if()语句来忽略main,你也会因为我已经提到的Object继承的方法失败了。

如果您只想尝试在课程中声明的方法,请使用getDeclaredMethods()代替getMethods()

答案 4 :(得分:0)

当您尝试调用需要参数而不提供任何参数的方法时会发生错误。

对于一般解决方案,您可能需要对此进行测试:

if (method[i].getParameterTypes().length ==0)
{
   method[i].invoke(t);
}

这测试方法是否有参数并跳过它

请参阅here