2011-12-09 69 views
4

我试图运行下面的代码:抛出:IllegalArgumentException:错误的参数数目

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。

回答

7

你实际上是调用正确的方法,问题是,Class.getMethods()方法返回类的所有方法,包括那些从超类,如在这种情况下,Object继承。所述documentation状态:

返回包含反射的类或接口的该Class对象表示所有的公共成员方法,包括那些由类或接口和那些从超类和超接口继承的声明的方法的对象的阵列。

在这种情况下,您可能最终会在没有任何参数的情况下调用Object.equals。这同样适用于该方法的Object.wait等

+1

谢谢'getDeclaredMethods()'定了! –

0

根据documentation

如果形式参数的由底层方法所需的数量是0,所供给的args数组可以是长度为0或空的。

你试过吗?

m.invoke(cls, null); 
+0

是,抛出同样的异常。 –

相关问题