需求:给你任意一个对象,在不清楚对象字段的情况下,可以将对象的字段名称(变量名)和对应值(具体值,或默认值)存储到文件中去。
分析:
1、定义一个方法接收任意类的对象;
public class BatisUtil {
}
2、每次调用时,获取并解析对象的全部成员变量名称;
3、使用反射获取对象的Class类对象,然后获取全部成员变量信息;
4、遍历成员变量信息,然后提取当前成员变量在对象中的具体值;
5、将成员变量的名称及其具体值存入文件。
存入对象信息:
public class Reflect {
public static void main(String[] args) {
// 学生类,可以自己写任意的成员变量,私有或者公开都可以
// 注:私有的成员变量按Java是不可以在其它类里面使用的,因此需要暴力打开权限才可以使用
Student s = new Student();
s.setName("张三");
s.setClassName("刑一班");
s.setAge(23);
s.setHobby("讲个故事,开个玩笑");
s.setSex('男');
// 输入基本信息,并送给BatisUtil类中的save()方法中进行保存
BatisUtil.save(s);
Teacher t = new Teacher();
t.setName("罗翔");
t.setSex('男');
t.setSalary(20000);
// 输入基本信息,并送给BatisUtil类中的save()方法中进行保存
BatisUtil.save(t);
}
}
对象信息解析保存:
public class BatisUtil {
public static void save(Object obj) {
try (
// 高级输出流--打印流PrintStream
// 将需要打印的数据写入对应的文件中,当前使用的是idea中的相对路径,
// 为了方便后续使用时,之前的数据仍然存在,使用新建低级流,字节将继续写入文件末尾,而不是开头
PrintStream ps = new PrintStream(new FileOutputStream("d14_junit_reflect_annotation_proxy_app/src/data.txt", true));
){
// 获取送入的对象类
Class c = obj.getClass();
// 表明对象的类简易名称
ps.println("--------" + c.getSimpleName() + "-----------");
// 通过方法getDeclaredFields()获取当前类对象所有的成员变量名称,并返回数组
Field[] declaredFields = c.getDeclaredFields();
// 遍历每一个成员变量的名称,并获取其具体的值,打印给文件
for (Field declaredField : declaredFields) {
// 记录当前的成员变量名称
String var = declaredField.getName();
// 注:暴力打开权限的方法,将类对象的私有成员暴露给本类使用,将获取完整的数据信息
declaredField.setAccessible(true);
// 返回指定对象上由 this 表示的字段的值
// 假设学生类,变量名为name,获取name在obj对象下设置的具体值
String value = declaredField.get(obj) + "";
// 将完整信息打印给文件
ps.println(var + "==>" + value);
// 注:流的使用都需要在使用后刷新与关闭,当前使用try(流放在此处,会在使用后自动帮助你刷新并关闭,很好使用,注:流得是实现了Closeable/AutoCloseable接口的类对象才行){}catch{}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果展示:
可以自己总结一下,在学习得过程中学到什么哦,敲起来吧。。。