Java中 反射 机制 的应用实例
- 在项目src文件中新建一个包:com.itheima.reflect,并在该包下创建Student类。
- Student类的属性:String name,String gender,int age
- 定义一个方法:createObject(),方法返回值类型为:Object
- 创建Properties集合并读取stu.properties文件中的内容到集合中。
- 根据class获得学生类全名,并通过反射技术获得Class对象。
- 通过调用Class对象的方法创建学生对象。
- 遍历Properties集合,利用反射技术给学生成员变量赋值。
- 返回封装好数据的学生对象
Student 类:
public class Student {
private String name;
private String gender;
private int age;
}
以及无参构造,get,set和toString方法
student.propreties属性集文件:
class=cn.itcast.HomeWork.Studemt
name=迪丽热巴
age=18
gender=female;
测试类:
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException, InstantiationException {
Student s = createObject();
System.out.println(s);
}
public static Studemt createObject() throws IOException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
// //需求 :解析src下的student.properties文件 创建对象 设置属性值
// // 1 加载student.properties配置文件
Properties pro = new Properties();
// // 2 根据配置文件的class的key获取value全限定名
InputStream is = Test.class.getClassLoader().getResourceAsStream("student.properties");
pro.load(is);
// // 3 根据全限定名获取该类的Class字节码对象
String className = pro.getProperty("class");
System.out.println(className);
Class c = Class.forName(className);
// // 4 获取配置文件中的所有key (stringPropertyNames())
Set<String> set = pro.stringPropertyNames();
System.out.println(set);
// // 6 据字节码对象获取字段(key)
Object obj = c.newInstance();
// // 5 遍历循环排除掉class
for(String s :set){
if(s.equals("class")){
continue;
}
String value = pro.getProperty(s);
Field f = c.getDeclaredField(s);
f.setAccessible(true);
// 7 根据key获取配置文件对应的value (String) 给字段设置
// 1 判断key的类型 gettype()
//如果是String.class类型 直接赋值
Integer.parseInt(String)
if(f.getType()==String.class){
f.set(obj,value);
}
// 如果是int类型
else if(f.getType()==int.class){
f.setInt(obj,Integer.parseInt(value));
}
}
return (Student)obj;
}
}
运行后输出:
小结:该反射案例的目的是然我们感受反射机制的强大之处,在后面学习的Spring框架中就会有大量根据配置文件信息
创建对象的过程,其内部的原理和我们这个案例的原理是一样,有这个案例做基础,以后学到spring框架时就会容
易理解了。