教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

反射的应用

更新时间:2018年09月18日15时31分 来源:传智播客 浏览次数:

反射的应用,读取properties配置文件的属性和值,通过反射创建对象
stu.properties,存储在项目的src文件夹下,内容如下:
class=com.itheima.reflect.Student
name=jack gender= age=18
Student实体类public class Student {
    private String name;
    private String gender;
    private int age;

    public Student() {
    }

    public Student(String nameString gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" name '\'+
                ", gender='" gender '\'+
                ", age=" age +
                '}';
    }
}
测试类根据配置文件信息创建一个学生对象。import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.Properties;
import java.util.Set;

public class Demo06 {
    public static void main(String[] args) {
        // 获取对象
        Student stu = (Student) createObject();
        // 输出对象
        System.out.println(stu);
    }

    public static Object createObject(){
        try {
            // 创建属性集合
            Properties p = new Properties();
            // 从文件中加载内容到集合中,编码与idea一致避免乱码
            p.load(new InputStreamReader(new FileInputStream("stu.properties"),"utf-8"));//src 路径下
            // 从集合中获得类名
            String className = p.getProperty("class");
            // 通过反射获得Class对象
            Class cla = Class.forName(className);
            // 快速创建对象
            Object obj = cla.newInstance();
            Set<String> names = p.stringPropertyNames();//获取所有属性
            // 遍历集合
            for (String name : names) {
                // 判断name是否class
                if(name.equals("class")){
                    continue;
                }
                // 获得值
                String value = p.getProperty(name);
                // 根据成员变量名获得对应的Field对象
                Field f = cla.getDeclaredField(name);
                // 暴力反射
                f.setAccessible(true);
                // 获得成员变量的类型
                Class<?> type = f.getType();
                if(type==int.class){// 判断成员变量的数据类型是否是int类型
                    f.setInt(objInteger.parseInt(value));
                }else{
                    // f对象的赋值
                    f.set(obj,value);
                }

            }
            // 返回对象
            return obj;
        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
执行main方法后控制台将输出
Student{name='jack', gender='男', age=18}




作者:传智播客JavaEE培训学院

首发:http://java.itcast.cn

0 分享到:
和我们在线交谈!