可以用于只知道类的名字然后想实例化的情况.
先定义一个类
class User {
private int age;
private String name;
public User() {
super();
}
public User(String name) {
super();
this.name = name;
}
public User(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [age=" + age + ", name=" + name + "]";
}
}
然后实例化的时候用到的东西:
newInstance
:Class
对象调用的话用默认构造方法来实例化,构造方法对象调用的话就是用那个方法.getConstructor
: 得到所有构造函数,是Constructor
类型.getParameterTypes
得到构造函数的签名,是Class
类型的数组. ```java public class ReflectionTest { public static void main(String[] args) throws Exception {Class<?> class1 = Class.forName("com.tianmaying.User"); // 第一种方法,调用Class的newInstance()方法,这会调用类的默认构造方法 User user = (User) class1.newInstance(); user.setAge(20); user.setName("tianmaying"); System.out.println(user);
// 第二种方法 先取得全部的构造函数,然后使用构造函数创建对象
Constructor<?> cons[] = class1.getConstructors();
for (int i = 0; i < cons.length; i++) {
// 查看每个构造方法需要的参数
Class<?> clazzs[] = cons[i].getParameterTypes();
// 打印构造函数的签名
System.out.print("cons[" + i + "] (");
for (int j = 0; j < clazzs.length; j++) {
if (j == clazzs.length - 1)
System.out.print(clazzs[j].getName());
else
System.out.print(clazzs[j].getName() + ",");
}
System.out.println(")");
}
// 调用构造函数
user = (User) cons[0].newInstance("tianmaying");
System.out.println(user);
// 调用另一个构造函数
user = (User) cons[1].newInstance(20, "tianmaying");
System.out.println(user);
}
} ```