一、创建对象
追根溯源
//早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存, //并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象. //com.study.reflection.Person person=new com.study.reflection.Person();
现在:
//现在: String name = "cn.itcast.bean.Person"; //找寻该名称类文件,并加载进内存,并产生Class对象。 Class clazz = Class.forName(name);
如何产生对象?
在1.6API中 java.lang包中有个Clss类,类中有个方法,用于创建对象,返回一个泛型。
T | newInstance() 创建此 Class 对象所表示的类的一个新实例。 |
Object obj = clazz.newInstance();
查看一下newInstance( )方法 其实还是和new Object( ) 空参构造函数一样。需要调用空参构造函数。
com.study.reflection.Person person=new com.study.reflection.Person();
//现在:
String name = "com.study.reflection.Person";
//找寻该名称类文件,并加载进内存,并产生Class对象。
Class clazz = Class.forName(name);
//如何产生该类的对象呢?
Object obj = clazz.newInstance();
其实以上三句代码的作用就是第一句代码的作用。那么既然这么省事为什么不用new 一句话创建对象。
其实,三句代码我们可以封装起来,以后创建对象时,只需要在配置文件中配置需要创建对象的类路径即可,程序读取配置文件就能创建对象。无需每次都new 一个对象。
二、构造函数
既然newInstance()也需要走空参构造函数。那么如果没有空参构造函数,指定使用带有参数列表的构造函数该怎么使用?
当获取指定名称对应类中的所体现的对象时,而该对象初始化不使用空参数构造该怎么办呢?
既然是通过指定的构造 函数进行对象的初始化,所以应该先获取到该构造函数。 通过字节码文件对象即可完成。该方法是:getConstructor(paramterTypes);
Constructor<T> | getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 |
首先创建Person类
public class Person {
private int age;
private String name;
public Person(String name,int age) {
super();
this.age = age;
this.name = name;
System.out.println("Person param run..."+this.name+":"+this.age);
}
public Person() {
super();
System.out.println("person run");
}
public void show(){
System.out.println(name+"...show run..."+age);
}
private void privateMethod(){
System.out.println(" method run ");
}
public void paramMethod(String str,int num){
System.out.println("paramMethod run....."+str+":"+num);
}
public static void staticMethod(){
System.out.println(" static method run......");
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
通过构造函数获得Person实例
private static void createNewObject2() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
/*
* 当获取指定名称对应类中的所体现的对象时,
* 而该对象初始化不使用空参数构造该怎么办呢?
* 既然是通过指定的构造 函数进行对象的初始化,
* 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。
* 该方法是:getConstructor(paramterTypes);
*
*/
String name ="com.study.reflection.Person";
//找寻该名称类文件,并加载进内存,并产生Class对象。
Class clazz = Class.forName(name);
//获取到了指定的构造函数对 象。
Constructor constructor = clazz.getConstructor(String.class,int.class);
//通过该构造器对象的newInstance方法进行对象的初始化。
Object obj = constructor.newInstance("小明",38);
System.out.println(obj);//com.study.reflection.Person@1b6d3586
}