使用反射操作分别利用public无参构造器、public有参构造器、private有参构造器创建对象实例。
其中,private有参构造器创建实例需要使用暴破操作
package test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 利用反射调用对象的不同构造器创建实例
*/
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
//1.先获取Person类的Class对象
Class<?> personClass = Class.forName("test.Person");
//方法1:通过public的无参构造器创建实例
Object person1 = personClass.newInstance();
System.out.println(person1);
//方法2:通过public的有参构造器创建实例
Constructor<?> constructor = personClass.getConstructor(String.class);
/*
constructor对象就是
public Person(String name) {
this.name = name;
this.age = 0;
}
*/
Object person2 = constructor.newInstance("john");
System.out.println(person2);
//方法3:通过非public的有参构造器创建实例
Constructor<?> declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);//得到private的构造器对象
declaredConstructor.setAccessible(true);//暴破,使用反射可以访问private构造器/方法/属性
Object person3 = declaredConstructor.newInstance("mike", 30);
System.out.println(person3);
}
}
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
private Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}