2014-07-02 99 views
2
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"); 
      } 
    } 

结果错误的数字显示:Method.invoke抛出java.lang.IllegalArgumentException异常:参数

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) 

请帮助我如何处理这个

+0

你的上限为环太大,它应该更像我 Smutje

回答

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(); 
    } 
    } 
} 

似乎在这里正常工作。

+1

但仍然使用上述修改后得到相同的结果。 – user1948008

+0

@ user1948008已编辑。还有其他一些你不想调用的方法。只要测试它是一种你想要的方法。 –

0

问题是在

for(int i=0;i<=method.length;i++){ 
      method[i].invoke(t); 
} 

你迭代,直到i有一个像method.length相同的值。 因为数组从0开始和method.length计数从1

你必须迭代,直到i<method.length OR i<=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

错误与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); 
    } 

} 
0

您可以使用下面的逻辑再想想你在做什么。 您遍历类中可用的所有公共方法(包括在超类中声明的方法)并尝试不带参数地调用,即假定所有方法都不接受任何肯定错误的参数。例如equals(Object)wait(long)继承自java.lang.Object需要一个参数。

编辑

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

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

如果您只想尝试在班级中声明的方法,请使用getDeclaredMethods()而不是getMethods()

0

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

对于您可能要测试这一个通用的解决方案:

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

此测试,如果该方法具有参数,并跳过它

here