学习反射的时候发现调用的构造器数组的顺序有点琢磨不透,于是自己试验下,写一个笔记。
Person person = null;
Class<?> cls = null;
cls = Class.forName("Person");//类路径
Constructor<?>[] cons = cls.getConstructors();//构造器的数组
person =(Person)cons[x].newInstance();//x表示下标,括号内对应构造函数
这个时候如果在Person里有多个构造函数时如:
public class Person {
private String name;
private int age;
private String sex;
private int num;
public Person(String name, int age, String sex, int num) {//4参构造
super();
this.name = name;
this.age = age;
this.sex = sex;
this.num = num;
}
public Person(String name, int age, String sex) {//3参构造
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public Person(String name, String sex) {//2参构造
super();
this.name = name;
this.sex = sex;
}
public Person(String name) {//1参构造
super();
this.name = name;
}
public Person() {//无参构造
super();
}
}
如果x与对应的构造函数(参数列表)不对应则会报以下错
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
那么这个下标怎么和构造函数匹配呢?
经过测试,发现:
当Person类中的构造函数只有两个时(无论是否有空构造函数)如:
public class Person {
private String name;
private int age;
private String sex;
private int num;
public Person(String name) {//1参构造
super();
this.name = name;
}
public Person() {//无参构造
super();
}
}
测试类的main方法中:
Class<?> cls = null;
Person person = null;
person = (Person)cls.newInstance();
//构造器
Constructor<?>[] cons = cls.getConstructors();
for (int j = 0; j < cons.length; j++) {
System.out.println("第"+j+"个构造器"+cons[j]);
}
输出:
第0个构造器public Person(java.lang.String)
第1个构造器public Person()
可以发现第0个是1参的构造函数;第一个是空构造函数,与Person类的构造函数的顺序相同;
当Person类中的构造函数有两个以上时(无论是否有空构造函数)如:
public class Person {
private String name;
private int age;
private String sex;
private int num;
public Person(String name, int age, String sex, int num) {//4参
super();
this.name = name;
this.age = age;
this.sex = sex;
this.num = num;
}
public Person(String name, int age, String sex) {//3参
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public Person(int age, int num) {//2参
super();
this.age = age;
this.num = num;
}
public Person(String name) {//1参
super();
this.name = name;
}
public Person() {//无参
super();
}
}
测试类的main方法同上
输出:
第0个构造器public Person()
第1个构造器public Person(java.lang.String)
第2个构造器public Person(int,int)
第3个构造器public Person(java.lang.String,int,java.lang.String)
第4个构造器public Person(java.lang.String,int,java.lang.String,int)
可以发现这次的顺序却和Person的构造函数的顺序相反;
因此可以知道:
构造器数组中元素的顺序与自定义类中编写的构造函数的顺序有关;且关系是:
当只有两个构造函数时,数组按照正序排序;(与类中构造函数的顺序一致)
当超过两个构造函数时,数组按照逆序排序;(与类中构造函数的顺序相反)