public void invokeMethod(Object owner)throws Exception{
        Class obj = owner.getClass();
        Method[] me = obj.getDeclaredMethods();
        for(Method object : me){
         object.setAccessible(true);
         Class [] param= object.getParameterTypes();
         if (param.length != 0) {
         object.invoke(owner, (Object)param);
}else{
object.invoke(owner);
}
        }
    }以上是我的解析方法,IDE报错为:
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at JavaReflection.JavaReflection.invokeMethod(JavaReflection.java:43)
at JavaReflection.JavaReflection.main(JavaReflection.java:82)

解决方案 »

  1.   

    wrong number of arguments多明显的问题,你的参数个数不对。
      

  2.   

    没问题怎么会报错,人家都说了,wrong number of arguments
      

  3.   

    你循环调用了owner这个对象的所有方法,而owner对象每个方法中的参数个可能不一样!你调用的时候可能调了有两个参数的方法,但object.invoke(owner, (Object)param);只传了一个参数!
    改成这样看看object.invoke(owner, Object...param);
      

  4.   

    getParameterTypes   这个返回的是方法的参数类型好吧。 
      

  5.   

    invoke的第二个参数形参是 Object[]
    所以
    object.invoke(owner, (Object)param);
    应该改成
    object.invoke(owner, param);//param可能需要转成Object[]
      

  6.   

    同意6楼和8楼的说法.method.invoke(Object obj, Object... args) 如果底层方法是静态的,那么可以忽略指定的 obj 参数,该参数可以为 null。 否则需要指定对象的实例如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null.否则需要提供实际的参数值.比如:method.invoke(obj, "admim","123456").如果obj只时类不是实例则应用obj.newInstance()---当然前提必须有无参的构造方法,否则就需要得到相应带参数的构造器对象通过反射得到对象实例. 
      

  7.   

    你根本搞错方法的意思Class [] param= object.getParameterTypes();
    这里返回的是这个方法所需要的参数类型列表
    object.invoke(owner, (Object)param);
    这里要传递的是这个方法的参数值!不是类型例如有一个方法public void a(int x, String y);Class[] param <==> {int.class, String.class}而在invoke的时候你需要传递的是实际的值!例如invoke(owner, new Object[]{1, "xyz"});这样
      

  8.   

    Class [] param= object.getParameterTypes();
                if (param.length != 0) {
                    object.invoke(owner, (Object)param);
                }else{
                    object.invoke(owner);
                }
    一个是参数类型,另一个是参数值,兄弟你用错了吧
      

  9.   

    invoke方法,第一个参数是对象,第二个是对应的方法参数类型对应的值的一个数组。
      

  10.   

    10楼的大哥说的挺好的啊,一个是类型,一个是值,这样调用当然会出错啦,楼主你可以试一下Class.newInstance()方法来根据Class获取实际的值,这个方法我也没试过,不知道行不行……