继上一篇博客【注解和反射】获取类运行时结构-优快云博客
目录
思考:难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确的调用类中的构造器并将参数传递进去之后,才可以实例化操作。
八、通过反射动态创建对象
在Java中,通过反射可以动态地创建对象,而不需要在编译时知道要创建的对象的具体类。以下是使用Java反射API创建对象的基本步骤:
-
获取Class对象: 首先,需要获取代表想要创建对象的类的
Class
对象。这可以通过几种方式之一来完成:- 使用
.class
语法,如果类名已知。 - 使用
Class.forName()
方法,通过类的全限定名(包括包名)获取Class
对象。这在类名在运行时才知道的情况下很有用。
- 使用
-
检查访问权限: 如果该类或其构造函数不是可访问的(即不是
public
),则需要通过调用setAccessible(true)
方法来临时允许访问。请注意,这种做法可能会违反Java的安全性原则,应谨慎使用。 -
获取Constructor对象: 接下来,需要获取
Constructor
对象,该对象表示类的构造函数。这可以通过调用Class
对象的getDeclaredConstructor()
方法来完成,该方法可以接收构造函数的参数类型作为参数。如果想要获取的是公共构造函数,则可以使用getConstructor()
方法。 -
创建实例: 一旦获得了
Constructor
对象,就可以调用它的newInstance()
方法来创建类的新实例。如果构造函数需要参数,那么这些参数需要传递给newInstance()
方法。
测试:通过反射动态创建对象
创建一个User类,
class User{
private String name;
private int id;
private int age;
public User(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
", age=" + age +
'}';
}
}
public class Test06 {
public static void main(Stri