反射的應(yīng)用,讀取properties配置文件的屬性和值,通過反射創(chuàng)建對(duì)象
stu.properties,存儲(chǔ)在項(xiàng)目的src文件夾下,內(nèi)容如下:
class=com.itheima.reflect.Student
name=jack gender=男 age=18
Student實(shí)體類public class Student {
private String name;
private String gender;
private int age;
public Student() {
}
public Student(String name, String 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 +
'}';
}
}
測(cè)試類根據(jù)配置文件信息創(chuàng)建一個(gè)學(xué)生對(duì)象。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) {
// 獲取對(duì)象
Student stu = (Student) createObject();
// 輸出對(duì)象
System.out.println(stu);
}
public static Object createObject(){
try {
// 創(chuàng)建屬性集合
Properties p = new Properties();
// 從文件中加載內(nèi)容到集合中,編碼與idea一致避免亂碼
p.load(new InputStreamReader(new FileInputStream("stu.properties"),"utf-8"));//src 路徑下
// 從集合中獲得類名
String className = p.getProperty("class");
// 通過反射獲得Class對(duì)象
Class cla = Class.forName(className);
// 快速創(chuàng)建對(duì)象
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);
// 根據(jù)成員變量名獲得對(duì)應(yīng)的Field對(duì)象
Field f = cla.getDeclaredField(name);
// 暴力反射
f.setAccessible(true);
// 獲得成員變量的類型
Class<?> type = f.getType();
if(type==int.class){// 判斷成員變量的數(shù)據(jù)類型是否是int類型
f.setInt(obj, Integer.parseInt(value));
}else{
// 給f對(duì)象的賦值
f.set(obj,value);
}
}
// 返回對(duì)象
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
執(zhí)行main方法后控制臺(tái)將輸出
Student{name='jack', gender='男', age=18}
作者:傳智播客JavaEE培訓(xùn)學(xué)院
首發(fā):http://java.itcast.cn