反射之构造方法简介
构造方法在调用的过程中首先会受到权限修饰符的约束,如果是public,类外也可以通过构造方法创建对应的类对象,如果是私有化的构造方法,只能在类内的方法中调用该构造方法,但是构造方法选择和【参数】有直接关系,而构造方法的名字是固定的,就是当前的类名;构造方法是依赖,参数类型区分的;根据参数的类型,个数,顺序来选择执行对应的构造方法;
通过Class类对象获取构造方法
<1>Constructor[] getConstrucctors(); 获取当前Class类对象内所有的非私有化构造方法类对象数组;
<2>Constructor[] getDeclaredConstructors(); 获取当前Class类对象内所有的构造方法类对象数组,包括私有化构造方法,【暴力反射】【私有化的也能获取】
<3>Constructor getConstructor(Class… initParametertypes);【重点】获取指定参数数据类型,顺序,个数的非私有化构造方法;
例如:
[1]public Person(int id,String name){} Class类对象 .getConstructor(int.class,String.class);
int.class,String.class 这里需要的构造方法参数类型是(int,String)
[2]Public Person(int id){} Class类对象.getConstructor(int.class);
[3]public Person(){} Class类对象.getConstructor();
①这里需要的参数类型是Class类对象,用于约束当前方法所需的数据类型;
②…是不定长参数,参数个数不限制;
<4>Constructor getDeclaredConstructor(Class… initParameterTypes);获取指定参数类型,顺序,个数对应的构造方法,可以获取私有化构造方法Constructor对象【暴力反射】
例如:private Person(String name); Class类对象 .getDeclaredConstructor(String.class);
class Panda{
public static void main(String[] args) throws NoSuchMethodException {
//首先创建Class类对象
Class classTest = Test.class;
//通过Class类对象获取Test类的构造方法
//获取Class类对象内所有的非私有化构造方法类对象数组
Constructor[] constructors = classTest.getConstructors();
//获取Class类对象内所有的构造方法类对象数组【包括私有化】【暴力反射】
Constructor[] constructors1 = classTest.getDeclaredConstructors();
//获取Class类对象指定参数类型,顺序,个数的非私有化构造方法Constructor类对象
//获取Test类的有三个参数的构造方法,传入参数应该是String.class,Integer.class,String.class
Constructor constructor = classTest.getConstructor(String.class,Integer.class,String.class);
//获取Test类没有参数的构造方法
Constructor constructor1 = classTest.getConstructor();
//获取Class类对象内任意指定类型的构造方法,包括【私有化构造方法】【暴力反射】
Constructor constructor2 = classTest.getDeclaredConstructor(String.class,Integer.class);
}
}
@Data
public class Test{
//成员变量
private String name;
private Integer age;
private String sex;
//无参构造方法
public Test(){}
//有参构造方法
public Test(String name,Integer age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
private Test(String name, Integer age){
this.name = name;
this.age = age;
}
}