Java中 反射 机制 的应用实例 D190409

Java中 反射 机制 的应用实例

  1. 在项目src文件中新建一个包:com.itheima.reflect,并在该包下创建Student类。
  2. Student类的属性:String name,String gender,int age
  3. 定义一个方法:createObject(),方法返回值类型为:Object
  4. 创建Properties集合并读取stu.properties文件中的内容到集合中。
  5. 根据class获得学生类全名,并通过反射技术获得Class对象。
  6. 通过调用Class对象的方法创建学生对象。
  7. 遍历Properties集合,利用反射技术给学生成员变量赋值。
  8. 返回封装好数据的学生对象

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框架时就会容
易理解了。

猜你喜欢

转载自blog.csdn.net/xc965746550/article/details/89160653