本文主要是介绍Day67(创建运行时类的对象,newInstance()),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
创建运行时类的对象
有了Class对象,能做什么?
创建类的对象:调用Class对象的newInstance()方法
要求:
1)类必须有一个无参数的构造器。
2)类的构造器的访问权限需要足够。
难道没有无参的构造器就不能创建对象了吗?
不是!只要在操作的时候明确的调用类中的构造器,并将参数传递进去之后,才可以实例化操作。步骤如下:
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);
import org.junit.Test;import java.util.Random;/*
newInstance():调用此方法,创建对应的运行时类的对象。内部调用了运行时类的空参的构造器。
要想此方法正常的创建运行时类的对象,要求:
1.运行时类必须提供空参的构造器
2.空参的构造器的访问权限得够。通常,设置为public。
在javabean中要求提供一个public的空参构造器。原因:
1.便于通过反射,创建运行时类的对象
2.便于子类继承此运行时类时,默认调用super()时,保证父类此构造器*/
public class NewInstanceTest {@Testpublic void test1() throws IllegalAccessException, InstantiationException {Class<Person> clazz = Person.class;Person p = clazz.newInstance();System.out.println(p);}@Testpublic void test2() throws IllegalAccessException, InstantiationException, ClassNotFoundException {int num = new Random().nextInt(3);String classPath = "";switch (num) {case 0:classPath = "java.util.Date";break;case 1:classPath = "java.lang.Object";break;case 2:classPath = "com.lingxiang.reflection.Person";break;}Object obj = getInstance(classPath);System.out.println(obj);}/*创建一个指定类的对象classPath:指定类的全类名*/public Object getInstance(String classPath) throws ClassNotFoundException, IllegalAccessException, InstantiationException {Class clazz = Class.forName(classPath);return clazz.newInstance();}
}
这篇关于Day67(创建运行时类的对象,newInstance())的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!