【反射】Java反射的使用-调用构造方法

442 阅读2分钟

构造方法

获取构造方法

同理,在我们拿到类的大Class后,我们就可以为所欲为了。

  • getConstructor(Class...):获取某个publicConstructor
  • getDeclaredConstructor(Class...):获取某个Constructor
  • getConstructors():获取所有publicConstructor
  • 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对象

  1. newInstance():创建该构造函数的新实例。
  2. getGenericParameterTypes():返回构造函数形参的泛型参数类型。
  3. getParameterTypes():返回构造函数形参的类型。
  4. getName():返回构造函数的名字。
  5. getModifiers():返回构造函数的修饰符。
  6. getAnnotation(), 获得构造方法上的注解
  7. isAnnotationPresent(), 判断是否有注解

上面就是Constructor的常用方法。

Constructor 主要用来实例化对象和获取构造函数信息。利用这些信息可以更灵活地生成和操作对象。