反射的应用,读取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 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 +
'}';
}
}
测试类根据配置文件信息创建一个学生对象。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(obj, Integer.parseInt(value));
}else{
// 给f对象的赋值
f.set(obj,value);
}
}
// 返回对象
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
执行main方法后控制台将输出
Student{name='jack', gender='男', age=18}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253302.html