【Java反射(一)】获取及设置属性值

目录

背景

获取属性值

设置属性值

完整代码

参考


背景

反射说起来还是上学时候刚学java基础的时候写过单测,之后就再也没用过了,全还给老师了。最近在项目里遇到了一个场景,需要对多个类的相同字段进行相同的逻辑处理,而这些类有些已经继承了其他父类了。略一思考,封装一个方法,入参是Objec,通过反射获取相同的字段,进行业务逻辑处理。听起来是个可行方案,然后我就踩坑了,over。

获取属性值

getDeclaredField(String name) 获取name字段,public和protected和private,不包括父类字段
getField(String name) 获取name字段,public,包括父类字段

非常巧,我要获取父类private的字段,怎么搞呢?获取字段之前先调用下面的方法就好了!

getSuperclass() 获取父类                                      

可以拿到属性字段了,下面获取 属性值

setAccessible(true) 如果属性是private,先设置属性可操作权限
get(obj) 获取属性值

设置属性值

setAccessible(true) 如果属性是private,先设置属性可操作权限
set(Object obj, Object value) obj属性字段,value 要设置的值

完整代码

    public void getAndSetFieldValue(Object request) {
        try {

            Class requestClass = request.getClass();
            //1. 获取属性值
            Field departIdField = null;
            //1.1 获取属性字段
            try {
                departIdField = requestClass.getDeclaredField("departId");

            } catch (NoSuchFieldException e) {
                departIdField = requestClass.getSuperclass().getDeclaredField("departId");
            }
            //1.2 获取属性值
            departIdField.setAccessible(true);
            Object departIdValueObj = departIdField.get(request);

            //2. 设置属性值
            Field officeCodeListField = null;
            //2.1 获取属性字段
            try {
                officeCodeListField = requestClass.getDeclaredField("officeOrgCodeList");
            } catch (Exception e) {
                officeCodeListField = requestClass.getSuperclass().getDeclaredField("officeOrgCodeList");
            }
            //2.3 设置属性值
            officeCodeListField.setAccessible(true);
            officeCodeListField.set(request, Arrays.asList("123", "456"));

        } catch (Exception e) {
            // 异常处理
        }
    }

参考

反射得到父类私有字段并且赋值

Java-Reflection反射-获取包括父类在内的所有字段

利用java反射获取和设置属性值

反射是否真的会让你的程序性能降低?

猜你喜欢

转载自blog.csdn.net/yxz8102/article/details/106062735
今日推荐