1. 获取和操作构造器
- 获取和操作构造器分为三个步骤:
- 首先获取目标类的字节码文件
- 然后获取字节码对象中的目标构造器
- 最后通过构造器创建声明实例化对象
1.1. Class 类中获取构造器的方法
1.1.1. getConstructors() 方法
- 定义:
public Constructor<?>[] getConstructors()
- 作用:
返回当前 Class 所表示类的所有public
构造方法, 并以Constructor
数组的形式返回.
1.1.2. getDeclaredConstructors() 方法
- 定义:
public Constructor<?>[] getDeclaredConstructors()
- 作用:
获取当前 Class 所表示类中所有的构造器, 无视访问权限进行获取.
1.1.3. getConstructor(Class<?>... parameterTypes) 方法
- 定义:
public Constructor<T> getConstructor(Class<?>... parameterTypes)
- 作用:
获取当前 Class 所表示类中指定的一个public
构造器. - 参数:
方法的参数表示构造器中所需传递的参数的 Class 类型, 例如:- 存在如下构造器, 构造器需要传入一个
String
类型的参数public User(String name){}
- 因此可以通过如下方式去获取这个指定的构造器
Class cls = User.class; Constructor c = cls.getConstructor(String.class);
- 存在如下构造器, 构造器需要传入一个
1.1.4. getDeclaredConstructor(Class<?>... parameterTypes) 方法
- 定义:
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
- 作用:
获取当前 Class 所表示类中指定的一个构造器, 无视访问权限获取任意指定构造器.
1.2. Constructor 类中操作构造器的方法
java.lang.reflect.Constructor<T>
1.2.1. newInstance(Object... initargs) 方法
定义:
public T newInstance(Object... initargs)
作用:
使用此Constructor
对象表示的构造方法来创建该构造方法的声明类的新实例.
并用指定的初始化参数初始化该实例, 若构造器本身不需要传入参数即可声明实例,
则参数可以不写.返回:
通过调用此对象表示的构造方法来创建的新对象.注意:
如果获取的目标是一个私有构造器, 获取后如果直接调用会报错,
报错的原因是非法访问私有权限的构造器, 默认是不能访问的.
但可以通过反射中的方法来设置访问权限为可以访问.
1.2.2. setAccessible(boolean flag) 方法
定义:
public void setAccessible(boolean flag)
作用:
将此对象的accessible
标志设置为指示的布尔值.- 值为
true
则指示反射的对象在使用时应该取消 Java 语言访问检查. - 值为
false
则指示反射的对象应该实施 Java 语言访问检查.
- 值为
1.2.3. 备注
Class
类中也存在newInstance()
方法, 当一个类的构造器无参且外界可直接访问,
则可以直接通过字节码对象调用这个方法来声明新实例.AccessibleObject
是Constructor, Field, Method
这三个类的父类,
分别对应构造器, 字段和方法, 这三个反射获取类中信息的类,
因此这三个类都有继承方法可对实例化对象进行访问权限控制.