可以用于只知道类的名字然后想实例化的情况.
先定义一个类
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;}@Overridepublic 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);
}
} ```
