1、获取多个Constructors时出现的问题
在类中定义的构造方法的顺序为:
package Reflect;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
然后通过下列方法获取多个Constructors:
Class<?> demo = null;
try {
demo = Class.forName("Reflect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Constructor<?> cons[] = demo.getConstructors();
for (Constructor c: cons){
System.out.println(c);
}
最后for循环输出的结果如下:
可见,getConstructors()获取的构造方法列表没有按照我们之前定义的顺序,也就是说获取到的数组是无序的!
那么,我们使用Java的反射机制的时候,该如何确定我们要使用哪个构造函数来实例化对象呢?
2、通过getConstructor(Class<?> parameterTypes)
来获取指定构造函数
在上面的讨论中,我们发现,当一个类中有多个构造方法时,我们无法确定的去调用指定的构造方法。那我们换个思路来想一下,一个类中存在多个构造函数,其实就是多态,这时候能唯一区分不同构造函数的就是根据它们的参数列表的不同来区分。幸好,JDK里面为我们实现了这个方法,那就是getConstructor(Class<?> parameterTypes)
,关于这个方法的详细信息,请查看JDK文档:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html。
现在,获取参数列表为String name的构造函数,并且实例化,如下:
Person person = null;
person = (Person)demo.getConstructor(String.class).newInstance("Rollen");
//输出
System.out.println(person);
输出的结果为:
当构造函数的参数列表有多个参数的时候,获取方法如下:
Person person = null
Class[] classes = new Class[]{String.class, int.class};
person = (Person)demo.getConstructor(classes).newInstance("Rollen", 23);
//输出
System.out.println(person);
输出的结果为:
所以,Java反射机制这样就可以创建指定构造函数的实例了。
参考文章:
1、如何通过反射来创建对象?getConstructor()和getDeclaredConstructor()区别?
https://www.cnblogs.com/jiangyi-uestc/p/5686264.html
2、Java反射机制及IoC原理
https://www.cnblogs.com/Eason-S/p/5851078.html