文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java使用反射给对象属性赋值

2023-09-02 17:41

关注
📢 📢 📢 📣 📣 📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步 🤝 🤝
一位上进心十足的【Java ToB端大厂领域博主】! 😜 😜 😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决 😜 😜 😜

✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我
❤️ ❤️ ❤️感谢各位大可爱小可爱! ❤️ ❤️ ❤️
————————————————
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

最近项目中遇到一个问题,就是能实现一个类将以后的多语都进行转换的通用方法,根据这个需求,决定使用反射实现,根据反射给对象属性设置属性值,下面是使用反射实现对对象属性值进行设置的方法

方法1:这里使用了Field的set方的 Field 属性,然后设置可见性,然后设置了一个值,最后打印

// 给变量赋值 给object对象的某个字段赋值

f.set(object, value);

//拿到了Field类的实例后就可以调用其中的方法了

//方法:get(Object obj) 返回指定对象obj上此 Field 表示的字段的值

package com.example.reflectiondemo;import java.lang.reflect.Field;public class ReflectMain {    private String readOnly;    public String getReadOnly() {        return readOnly;    }    public void setReadOnly(String readOnly) {        System.out.println("set");        this.readOnly = readOnly;    }    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {        ReflectMain t = new ReflectMain();        Field f = t.getClass().getDeclaredField("readOnly");        f.setAccessible(true);        f.set(t, "test");        System.out.println(t.getReadOnly());    }}

方法2:使用invoke方法

package com.example.reflectiondemo;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectMain {    private String readOnly;    public String getReadOnly() {        return readOnly;    }    public void setReadOnly(String readOnly) {        System.out.println("set");        this.readOnly = readOnly;    }    //    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {//        ReflectMain t = new ReflectMain();//        Field f = t.getClass().getDeclaredField("readOnly");//        f.setAccessible(true);//        f.set(t, "test");//        System.out.println(t.getReadOnly());////    }    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {        ReflectMain t = new ReflectMain();        Method setReadOnly = t.getClass().getMethod("setReadOnly", String.class);        String s = "test2";        setReadOnly.invoke(t, s);        System.out.println(t.getReadOnly());    }}

由此可见,使用反射我们能给很容易的给各个属性进行设置,即使是private的属性我们也能很轻松的设置属性值,下面利用这个demo例子,就设置了我们的最初的功能。

总结:

也就是说,第一种方法,没有调用属性的set方法就完成了赋值,

但是第二种方法,是通过调用属性的set方法来完成赋值。

所以,如果想在程序中改变程序的属性的值的同时还想做一些额外的事情,可以将这些事情写到set方法中并使用第二种方法

public class MultiLangContentUtil {        public static void setMultiLangDTOName(Object targetPO, Object targetDTO, String targetMultiName) {        try {            String locale = MultiLangContentUtil.getLocale();            Class targetDTOClass = targetDTO.getClass();            Class targetPOClass = targetPO.getClass();            //这里是将targetMultiName进行展示            Field declaredFieldDTO = targetDTOClass.getDeclaredField(targetMultiName);            declaredFieldDTO.setAccessible(true);            switch (locale) {                case ZH_CN:                    //获取PO的值                    Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName);                    //获取DTO对象                    declaredFieldPO.setAccessible(true);                    //对DTO根据PO进行设置                    declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO));                    break;                case EN_US:                    //获取PO的值                    Field declaredFieldPO2 = targetPOClass.getDeclaredField(targetMultiName + 2);                    //获取DTO对象                    declaredFieldPO2.setAccessible(true);                    //对DTO根据PO进行设置                    declaredFieldDTO.set(targetDTO, declaredFieldPO2.get(targetPO));                    break;                case ZH_TW:                    //获取PO的值                    Field declaredFieldPO3 = targetPOClass.getDeclaredField(targetMultiName + 3);                    //获取DTO对象                    declaredFieldPO3.setAccessible(true);                    //对DTO根据PO进行设置                    declaredFieldDTO.set(targetDTO, declaredFieldPO3.get(targetPO));                    break;                default:                    break;            }            //防止没有抽取多语的情况下没有参照返回,默认情况下设置中文            if (StringUtils.isBlank((String) declaredFieldDTO.get(targetDTO))) {                //获取PO的值                Field declaredFieldPO = targetPOClass.getDeclaredField(targetMultiName);                //获取DTO对象                declaredFieldPO.setAccessible(true);                //对DTO根据PO进行设置                declaredFieldDTO.set(targetDTO, declaredFieldPO.get(targetPO));            }        } catch (NoSuchFieldException e) {            log.error("查询当前字段--->{}不存在{},", targetMultiName, e);        } catch (IllegalAccessException e) {            log.error("查询字段--->{}多语时发生非法状态异常{},", targetMultiName, e);        } catch (Exception e) {            log.error("查询字段{}多语时发生错误{},", targetMultiName, e);        } catch (Throwable throwable) {            log.error("查询多语言字段{}发生未知错误{}", targetMultiName, ThrowableUtil.stackTraceToString(throwable));        }    }        public static void updateMultiLang(Object targetDTO, Object targetPO, String fieldName, Integer MultiLangSize) {        try {            Class targetDTOClass = targetDTO.getClass();            Class targetPOClass = targetPO.getClass();            Field dtoClassField = targetDTOClass.getDeclaredField(fieldName);            dtoClassField.setAccessible(true);            if (StringUtils.isNotBlank((String) dtoClassField.get(targetDTO))) {                Field poClassField = targetPOClass.getDeclaredField(fieldName);                poClassField.setAccessible(true);                poClassField.set(targetPO, dtoClassField.get(targetDTO));            }            for (int i = 2; i <= MultiLangSize; i++) {                Field dtoClassField2 = targetDTOClass.getDeclaredField(fieldName + i);                dtoClassField2.setAccessible(true);                if (StringUtils.isNotBlank((String) dtoClassField2.get(targetDTO))) {                    Field poClassField2 = targetPOClass.getDeclaredField(fieldName + i);                    poClassField2.setAccessible(true);                    poClassField2.set(targetPO, dtoClassField2.get(targetDTO));                }            }        } catch (NoSuchFieldException e) {            log.error("更新当前字段--->{}不存在{},", fieldName, e);        } catch (IllegalAccessException e) {            log.error("更新字段--->{}多语时发生非法状态异常{},", fieldName, e);        } catch (Exception e) {            log.error("更新字段{}多语时发生错误{},", fieldName, e);        } catch (Throwable throwable) {            log.error("更新多语言字段{}发生未知错误{}", fieldName, ThrowableUtil.stackTraceToString(throwable));        }    }        public static final String getLocale() {        String locale = InvocationInfoProxy.getLocale();        return StringUtils.isEmpty(locale) ? "zh_CN" : locale;    }}

这个工具类的核心思想就是

// 给变量赋值 给object对象的某个字段赋值

f.set(object, value);

//拿到了Field类的实例后就可以调用其中的方法了

//方法:get(Object obj) 返回指定对象obj上此 Field 表示的字段的值

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

来源地址:https://blog.csdn.net/qq_29235677/article/details/128553368

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯