java反射

最近有遇到一个API需要传递近百个字段值的情况,在pc端是全量更新或者保存的,没发现问题;在微信端做了个差不多的功能,只不过是分块保存这些数据的,由于传递速率的问题,微信端想只传递每次修改的值到后台,然后导致该API用的一个全量字段的bean来接受的,所以将有的不需要改变的值全改为null,后台一保存,数据就全乱了。后来一个同事说用反射吧,每次只修改前端传过来的字段值。由于平常关于反射的写的少,所以在写一个demo时,遇到一些问题。下面是写的步骤。

获取类的所有字段值

通过Class.forName("你的类路径")获取该类,我的测试类是


Class studentClass = Class.forName("day12.Student");

因为之前有写过,所以一上手,我就直接那该类的getFields()获取所有的字段了,并输出信息

for (Field f : studentClass.getFields()) {
    System.out.println(f.getName());
}

发现输出内容为空,这是为啥???心想这咋还会错,不服,然后查看getFields方法的源码,
看到如下注释,原来这个方法是放回类的公共字段,因为我写的类里面定义的都是private类型,所以当然获取不到了。
1399733-20181030225933372-1390551689.png

有放回公共的字段,作为程序员的直觉,肯定有其他的方法获取protected,private的字段,getDeclaredFields()就是该方法,
获取类中所有的字段
1399733-20181030225944468-1334377994.png

Student student = new Student();
student.setAge(11);
student.setName("jack");
student.setSex("man");
student.setTail("180");

for (Field f : studentClass.getDeclaredFields()) {
    System.out.println(f.getName());
}

输出信息
1399733-20181030225958087-1226646530.png

通过反射改变类中字段值

这里直接模拟通过map中存的值来赋给已存在的类的值


        Student student = new Student();
        student.setAge(11);
        student.setName("jack");
        student.setSex("man");
        student.setTail("180");
        System.out.println(student.toString());

        Class studentClass = Class.forName("day12.Student");
        Map<Object, Object> map = new HashMap();
        map.put("name", "leo");
        map.put("age", 18);
        for (Object key : map.keySet()) {
            Field f = studentClass.getDeclaredField(key.toString());
            f.set(student, map.get(key));
        }

        System.out.println(student.toString());

满心欢喜准备运行,等待结果。。。报错
1399733-20181030230009812-1064667863.png

what?哦,从报错信息大致看出是private类型的字段,不能访问。
怎么办?暴力反射,解除私有限制了添加如下代码,有兴趣的可以深究该方法的源码

f.setAccessible(true);

输出信息为:
1399733-20181030230019698-1675165749.png

发现值只改变类map中有参数的值,其余值没有改变。所以可以模拟,后台通过map或者其它类型的对象来接受只想改变的参数,再通过反射改变从数据库里查出对象的值,从而达到网页传输效率最优的目的(这应该只针对字段数量庞大的时候,大部分api如果只有几个API,就没必要了。。。)

转载于:https://www.cnblogs.com/levcon/p/9880250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值