反射做通用框架 Java 学习

需求:给你任意一个对象,在不清楚对象字段的情况下,可以将对象的字段名称(变量名)和对应值(具体值,或默认值)存储到文件中去。

分析:

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();
        }
    }
}

结果展示:

 可以自己总结一下,在学习得过程中学到什么哦,敲起来吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未满3岁

我爱你,你爱我,蜜雪冰城甜蜜蜜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值