赞
赏
我们了解了 Class 类实例化的过程,在平时代码开发过程中,我们用 Class 类实例化对象的操作比较多。我们可以根据一个类路径(“包.类”)的字符串来获取到一个实例化对象。
在 构造方法 这个章节里面我们知道了创建对象的时候要通过构造方法来创建对象,并且构造方法分为有参构造方法和无参构造方法。使用 Class 类创造对象的时候,也要区分有参构造对象和无参构造对象。
类名 对象名称 = (类名)Class对象.newInstance(); //无参构造函数创建
类名 对象名称 = (类名)Class对象.newInstance(参数1,参数2...); //有参构造函数创建对像
我们首先定义一个类供创建对象,它里面有一个无参构造函数,一个有参构造函数
package com.haicoder.net.cls;
public class PersonForClass {
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PersonForClass() {
}
public PersonForClass(Integer age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "PersonForClass{" +
"name=" + name +
", age='" + age + '\'' +
'}';
}
}
定义一个测试类
package com.haicoder.net.cls;
import java.lang.reflect.Constructor;
public class ClassTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
Class<?> constructClass = null;
try {
constructClass = Class.forName("com.haicoder.net.cls.PersonForClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
System.out.println("========无参构造函数开始======");
PersonForClass personForClass = (PersonForClass) constructClass.newInstance();
personForClass.setAge(100);
personForClass.setName("嗨客网");
System.out.println("无参构造函数打印结果:" + personForClass.toString());
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("=============有参构造函数开始===========");
//获取全部构造方法,构造方法的顺序与代码里面的顺序一致
Constructor<?> cons[] = constructClass.getConstructors();
PersonForClass personForClass2 = (PersonForClass) cons[1].newInstance(200, "嗨客网");
System.out.println("有参构造函数打印结果:" + personForClass2.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下:
我们可以看到通过 newInstance 方法和类强转可以创建对象。使用 newInstance() 的时候,必须要有无参的构造函数的,不然类对象获取不到,识别不了创建对象,会抛出异常。
通过 Class 的 newInstance 方法,我们可以创建我们想要的对象。不过还是要依赖于构造方法的,一般建议在定义类的时候需要定义一个无参的构造方法。
在定义对象的时候,我们可以使用 getConstructors 将所有的构造方法获取出来,然后按照类里面定义的顺序使用构造方法来创建对象。