获取到Class,能干什么?
…通过Class的newInstance()方法来实例化对象
…注意:newInstance()内部实际上调用了无参数构造方法,必须保证无参数构造方法存在才可以。
反射机制可以让你的代码更加灵活。
后期学习java都会用到高级框架,这些高级框架都用到了反射机制。
学习反射机制有利于理解框架源代码。
下面是反射机制灵活的实例:
这是User类:
//
package cn.itcast.day04.demo01.Kt1.test2;
public class User {
public User(){
System.out.println("无参构造方法zhixing!");
}
}
这是通过反射机制实例化对象:
package cn.itcast.day04.demo01.Kt1.test2;
public class ThreadTest11 {
public static void main(String[] args){
//这是不适用反射机制,创建对象。
User user = new User();
System.out.println(user);
//下面是通过反射机制的方式创建对象。
try {
//通过反射机制,获取Class,通过Class来实例化对象。
//括号里面是User类的路径。
Class c =Class.forName("cn.itcast.day04.demo01.Kt1.test2.User");
//c代表User类型。
//newInstance()这个方法会调用User这个类的无参构造犯法,并完成对象的创建。
//重点是newInstance()调用的是User的无参数构造方法,所以要确保无参构造方法的存在。
Object obj =c.newInstance();
System.out.println(obj);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
这是验证反射机制的灵活性:
package cn.itcast.day04.demo01.Kt1.test2;
import java.io.FileReader;
import java.util.Properties;
/*
验证反射机制的灵活性。
java代码写一遍,在不改变java源代码的基础之上,可以做到不同对象的实例化,
非常灵活。(符合ocp开闭原则:对扩展开放,对修改关闭。)
*/
public class Reflect {
public static void main(String[] args) throws Exception{
//这种方式就写死了,只能创建User这一种类型的对象,
//User user = new User();
//以下代码时灵活的,代码不需要改动,
// 可以修改配置文件,配置文件修改后可以创建出不同的实例对象。
//通过io流读取classinfo.properties文件。
FileReader reader = new FileReader("day04-code/classinfo.properties");
//创建属性类对象Map
Properties pro = new Properties();//key 和value都是String。
//加载
pro.load(reader);
reader.close();
String classNmae = pro.getProperty("className");//通过Key获取value。
System.out.println(classNmae);
//通过反射机制实例化对象
Class c= Class.forName(classNmae);
Object obj = c.newInstance();
System.out.println(obj);
}
}
小toops:
后期使用框架就不用了去改代码,大部分都是修改配置文件,就是因为反射机制的灵活性。