import java.lang.reflect.Constructor;
import java.lang.reflect.Method;class Person {
public Person(){

}
public Class[] function(Class[] args) {
System.out.println("public Class[] function(Class [] args)");
return null;
}
}public class Demo { public static void main(String[] args) throws Exception {
Test6();
} // 我要反射Person的方法public Class[] function(Class [] args)
public static void Test6() throws Exception {
Class Person = Class.forName("Person");
Constructor con = Person.getConstructor();
Person p = (Person) con.newInstance();
Method m = Person.getMethod("function", Class[].class);
m.invoke(p, new Class[] {String.class,int.class});//这里为什么有错?
}}

解决方案 »

  1.   

    原因是jdk1.5后的自动拆箱功能,invoke的第二个参数是个可变参数,这个参数会对你传进来的数组进行拆箱,
    所以你调用此方法时new Class[]{String.class,int.class}这个参数被拆成了两个String.class,int.class所以就报出参数个数不对了。要让他能够运行通过,那么我们只要让编译器不拆箱就行了。可以这么调
    m.invoke(p,(Object)new Class[]{String.class,int.class});
    把这个数组转成Object就等于告诉编译器我这个是个对象不是一个数组别给我拆箱。
      

  2.   

    楼上的说错了吧,什么是拆装箱Integer i = 1;//自动装箱(就是将基本类型包装成对象)
    int j = i;//自动拆箱(就是将基本包装对象转为基本数据类型)我查询了可变参数的特点就是当传入数组的时候先把数组打散这个特点和拆装箱没关系吧??
      

  3.   

    改成这样:
    m.invoke(p, new Object[] {new Class[] {String.class,int.class}});
    invoke的第二个参数是调用方法的参数,是Object的数组,你的new Class[] {String.class,int.class}只是其中一个参数^_^
      

  4.   

     public static void Test6() throws Exception {
            Class Person = Class.forName("com.huangjunwei.Person");
            Constructor con = Person.getConstructor();
            Person p = (Person) con.newInstance();
            Method m = Person.getMethod("function", Class[].class);
            Class[] clazzs = new Class[] {String.class,int.class};
            m.invoke(p, new Object[]{clazzs});//这次就没错了
        }
    你看了invoke源代码就会发现第二个参数传入的是一个Object数组,所以你应该写成Object数组中包含你的function方法的Class数组,就是应该是一个二维数组。什么自动拆装啊,和这半毛钱的关系都没有。