前言
Constructor类是Java反射中重要的类,它是对类中构造器的描述的类。类似于Method(对类中方法的描述的类),Field(对类中属性的描述的类),我们通过创建Constructor的对象实例,就可以创建源对象。
Constructor
/**
* {@code Constructor} provides information about, and access to, a single
* constructor for a class.
*
* <p>{@code Constructor} permits widening conversions to occur when matching the
* actual parameters to newInstance() with the underlying
* constructor's formal parameters, but throws an
* {@code IllegalArgumentException} if a narrowing conversion would occur.
*
* @param <T> the class in which the constructor is declared
*
* @see Member
* @see java.lang.Class
* @see java.lang.Class#getConstructors()
* @see java.lang.Class#getConstructor(Class[])
* @see java.lang.Class#getDeclaredConstructors()
*
* @author Kenneth Russell
* @author Nakul Saraiya
*/
public final class Constructor<T> extends Executable {
//....
}
getParameterTypes
按照声明顺序返回一组Class对象,这些对象表示此Constructor对象所表示构造方法的形参类型。如果底层构造方法不带任何参数,则返回一个长度为0的数组。
@ToString
static class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws Exception {
User user = new User("晓断", 22);
for (Constructor<?> constructor : user.getClass().getConstructors()) {
// ["java.lang.String","int"]
System.out.println(JSON.toJSONString(constructor.getParameterTypes()));
}
}
newInstance
- 使用此Constructor对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。个别参数会自动解包,以匹配基本形参,必要时,基本参数和引用参数都要进行方法调用转换。
- 如果底层构造方法所需形参数为0,则所提供的initargs数组的长度可能为0或null。
- 如果构造方法的声明类是非静态上下文的内部类,则构造方法的第一个参数需要是封闭实例;请参阅Java语言规范第15.9.3节。
- 如果所需的访问检查和参数检查获得成功并且实例化继续进行,这时构造方法的声明类尚未初始化,则初始化这个类。
- 如果构造方法正常完成,则返回新创建且已初始化的实例。
@ToString
static class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
无参构造
public static void main(String[] args) throws Exception {
Constructor<User> constructor = User.class.getConstructor(null);
User user = constructor.newInstance();
// User(name=null, age=0)
System.out.println(user1);
user1.setAge(22);
// User(name=null, age=22)
System.out.println(user1);
}
有参构造
public static void main(String[] args) throws Exception {
Constructor<User> constructor = User.class.getConstructor(String.class, int.class);
User user = constructor.newInstance("晓断", 22);
// User(name=晓断, age=22)
System.out.println(user);
}
小结
Constructor大部分场景下还是构造实例对象的,其他的方法,可参阅:[https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html](