15-4 反射 ---- 创建运行时类的对象 & 体会反射的动态性
一、newInstance():
1.调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。
2.要想此方法正常的创建运行时类的对象,调用Class对象的newInstance()方法,要求:
(1)运行时类必须提供空参的构造器
(2)空参的构造器的访问权限得够。通常,设置为public。
3.在javabean中要求提供一个public的空参构造器。原因:
(1)便于通过反射,创建运行时类的对象
(2)便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器
二、难道没有无参的构造器就不能创建对象了吗?
不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。
步骤如下:
1)通过Class类的getDeclaredConstructor(Class … parameterTypes)取得本类的指定形参类型的构造器
2)向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。
3)通过Constructor实例化对象。
三、
1.根据全类名获取对应的Class对象
String name = “atguigu.java.Person";
Class clazz = null;
clazz = Class.forName(name);
2.调用指定参数结构的构造器,生成Constructor的实例
Constructor con = clazz.getConstructor(String.class,Integer.class);
3.通过Constructor的实例创建对应类的对象,并初始化类属性
Person p2 = (Person) con.newInstance(“Peter”,20);
System.out.println(p2);
代码:
package java1;
import org.junit.Test;
import java.util.Random;
public class NewInstanceTest {
//通过反射创建对应的运行时类的对象
@Test
public void test1() throws IllegalAccessException, InstantiationException {
Class clazz = Person.class;
//newInstance():调用此方法,创建对应的运行时类的对象,内部调用了运行时类的空参构造器
Person obj = (Person) clazz.newInstance();
System.out.println(obj);
}
//体会反射的动态性
@Test
public void test2(){
for(int i = 0;i < 10;i++){
int num = new Random().nextInt(3);//0,1,2
String classPath = "";
switch(num){
case 0:
classPath = "java.util.Date";
break;
case 1:
classPath = "java.lang.Object";
break;
case 2:
classPath = "java1.Person";
break;
}
try {
Object obj = getInstance(classPath);
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//创建一个指定类的对象。classPath:指定类的全类名
public Object getInstance (String classPath) throws Exception {
Class clazz = Class.forName(classPath);
return clazz.newInstance();
}
}
test1输出:
Person()
Person{name='null', age=0}
test2输出:
Person()
Person{name='null', age=0}
Person()
Person{name='null', age=0}
Person()
Person{name='null', age=0}
Person()
Person{name='null', age=0}
Wed Feb 24 15:36:21 CST 2021
Wed Feb 24 15:36:21 CST 2021
java.lang.Object@5d6f64b1
Person()
Person{name='null', age=0}
Wed Feb 24 15:36:21 CST 2021
Wed Feb 24 15:36:21 CST 2021