反射异常:java.lang.IllegalArgumentException: wrong number of arguments

package reflect;

import java.lang.reflect.Constructor;

import org.junit.Test;

public class Hello {

    @Test
    public void test4(){
        Class<?> demo=null;
        try {
            demo=Class.forName("reflect.Person");
        } catch (Exception e) {
            e.printStackTrace();
        }

        Person per1=null;
        Person per2=null;
        Person per3=null;
        Person per4=null;

        Constructor<?> cons[]=demo.getConstructors();
        System.out.println(cons.length);
        try {
            System.out.println("----------------------");
            per1=(Person) cons[0].newInstance();
            per2=(Person) cons[1].newInstance("Rollen");
            per3=(Person) cons[2].newInstance(20);
            per4=(Person) cons[3].newInstance("Rollen",20);

            System.out.println(per1);
            System.out.println(per2);
            System.out.println(per3);
            System.out.println(per4);
            System.out.println("========================");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        }
    }

class Person {
    private String name;
    private int age;

    public Person() {
        super();
    }

    public Person(String name){
        super();
        this.name=name;
    }

    public Person(int age){
        super();
        this.age=age;
    }

    public Person(String name,int age){
        super();
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

}

报错原因是:

Constructor<?> cons[]=demo.getConstructors();这对Person构造函数的封装是按Person类中构造函数所在的倒序顺序进行封装的。用System.out.println(Arrays.toString(cons));打印就可看出:
[
public reflect.Person(java.lang.String,int), 
public reflect.Person(int), 
public  reflect.Person(java.lang.String), 
public reflect.Person()
]。正好和Person类中的构造函数顺序是相反的
改错:
            per1=(Person) cons[0].newInstance();
            per2=(Person) cons[1].newInstance("Rollen");
            per3=(Person) cons[2].newInstance(20);
            per4=(Person) cons[3].newInstance("Rollen",20);
改为:
            per1=(Person) cons[0].newInstance("Rollen",20);
            per2=(Person) cons[1].newInstance(20);
            per3=(Person) cons[2].newInstance("Rollen");
            per4=(Person) cons[3].newInstance();

你可能感兴趣的:(异常)