构造方法
获取构造方法
同理,在我们拿到类的大Class后,我们就可以为所欲为了。
getConstructor(Class...):获取某个public的Constructor;getDeclaredConstructor(Class...):获取某个Constructor;getConstructors():获取所有public的Constructor;getDeclaredConstructors():获取所有Constructor。
注意: 通过反射是无法直接获得父类的构造函数的,因为构造函数不会被继承,所以子类是不可能获得父类构造函数的。
与前面的获得字段,方法一样,当父类的方法为私有或者字段为私有,子类是无法获得的。
这是一个很关键的点。
public class Main {
public static void main(String[] args) throws Exception {
Class<Student> studentClass = Student.class;
// 获得public构造方法
Constructor<Student> constructor1 = studentClass.getConstructor();
Student student = constructor1.newInstance();
// 获得非public构造方法
Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
declaredConstructor.newInstance("hhh");
}
}
class Student{
private String name;
public Student(){}
protected Student(String name){
this.name = name;
}
}
分析
通过getConstructor方法可以获得非public方法;
通过getDeclaredConstructor可以获得非public方法,当要使用它里面的方法时,需要使用setAccessible(true)来使其忽略修饰符。
当然,public方法就不用setAccessible(true)来取消修饰符的访问了。
通过这种办法获得的对象与new出来的对象没区别
上面我们通过一个例子知道了Constructor的基本用法,现在我们来看看Constructor类里具体有什么?
Constructor对象
- newInstance():创建该构造函数的新实例。
- getGenericParameterTypes():返回构造函数形参的泛型参数类型。
- getParameterTypes():返回构造函数形参的类型。
- getName():返回构造函数的名字。
- getModifiers():返回构造函数的修饰符。
getAnnotation(), 获得构造方法上的注解- isAnnotationPresent(), 判断是否有注解
上面就是Constructor的常用方法。
Constructor 主要用来实例化对象和获取构造函数信息。利用这些信息可以更灵活地生成和操作对象。