教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

反射的應用

更新時間:2018年09月18日15時31分 來源:傳智播客 瀏覽次數:

反射的應用,讀取properties配置文件的屬性和值,通過反射創(chuàng)建對象
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 +
                '}';
    }
}
測試類根據配置文件信息創(chuàng)建一個學生對象。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 {
            // 創(chuàng)建屬性集合
            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);
            // 快速創(chuàng)建對象
            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;
    }
}
執(zhí)行main方法后控制臺將輸出
Student{name='jack', gender='男', age=18}




作者:傳智播客JavaEE培訓學院

首發(fā):http://java.itcast.cn

0 分享到:
和我們在線交談!