目标:提供一个通用框架,支持保存所有对象的具体信息
首先创建两个实体类,分别是Student类和Teacher类来封装信息
Student.java
package reflect.d6_reflect_framework;
public class Student {
private String name;
private char sex;
private int age;
private String className;
private String hobby;
public Student(){}
public Student(String name, char sex, int age, String className, String hobby) {
this.name = name;
this.sex = sex;
this.age = age;
this.className = className;
this.hobby = hobby;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
Teacher.java
package reflect.d6_reflect_framework;
public class Teacher {
private String name;
private char sex;
private double salary;
public Teacher(){}
public Teacher(String name, char sex, double salary) {
this.name = name;
this.sex = sex;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
而后,写一个工具类,来保存任意类型的对象
MybatisUtil.java
package reflect.d6_reflect_framework;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
/*
保存任意类型的对象
@param obj
*/
public class MybatisUtil {
public static void save(Object obj) {
try (PrintStream ps = new PrintStream(new FileOutputStream("路径\\d6_reflect_framework.txt", true));
) {
// 1、提取这个对象的全部成员变量(只有反射可以解决)
Class c = obj.getClass();
// c.getSimpleName()获取当前类名 c.getName获取全限名:包名+类名
ps.println("=======" + c.getSimpleName() + "=======");
// 2、提取它的全部成员变量
Field[] fields = c.getDeclaredFields();
// 3、获取成员变量的信息
for (Field field : fields) {
// 拿成员变量名
String name = field.getName();
field.setAccessible(true);
// 提取本成员变量在obj对象中的值(取值)
String value = field.get(obj) + "";
//保存遍历到的成员变量的名和值
ps.println(name + "" + value);
}
// ps.close(); 将代码放在try()中会自动释放资源
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
main方法:
ReflectDemo.java
package reflect.d6_reflect_framework;
public class ReflectDemo {
public static void main(String[] args){
Student s = new Student();
s.setName("胡图图");
s.setClassName("翻斗幼儿园");
s.setAge(10);
s.setHobby("玩儿");
s.setSex('男');
MybatisUtil.save(s);
Teacher t = new Teacher();
t.setName("健康哥哥");
t.setSex('男');
t.setSalary(8000);
MybatisUtil.save(t);
}
}
运行main方法后,内容会输出到之前创建好的d6_reflect_framework.txt中。如下:
d6_reflect_framework.txt
=======Student=======
name胡图图
sex男
age10
className翻斗幼儿园
hobby玩儿
=======Teacher=======
name健康哥哥
sex男
salary8000.0