[java] 利用反射,将对象A中与对象B中字段名相同的属性值赋予对象B

前言:

最近开发遇到了这样一个需求,前端提交的表单对应类是origin,但后端数据库表对应类是target,两者中有重合字段,origin类中有待处理字段(例如String[] ids),我想到的解决方案是将origin对象中与target对象的同名字段值赋予target,再将待处理字段拆分后赋予target进行存储。首先想到的就是手动赋值(target.setValue(origin.getValue);)但这样不利于扩展并且不符合开闭原则。

所以使用反射进行同名字段赋值。

流程图:

sameFieldSetValue()

 

getValue():                    

setValue():

 

 

 

 

 

 

代码:

sameFieldSetValue():

private <T> T sameFieldSetValue(Object origin, T target){
        Field[] originFields = origin.getClass().getDeclaredFields();
        Field[] targetFields = target.getClass().getDeclaredFields();

        //遍历各对象寻找相同名字段,并赋值
        for(int i=0; i<originFields.length; i++){
            String originFieldName = originFields[i].getName();
            for(int j=0; j<targetFields.length; j++){
                if(targetFields[j].getName().equals(originFieldName)){
                    Object field = getValue(origin, originFieldName);
                    setValue(target, originFieldName, field);
                }
            }
        }
        return target;
    }

getValue():

private Object getValue(Object object, String fieldName) {
        try{
            Field[] fields = object.getClass().getDeclaredFields();

            for (Field field : fields) {
                String fName = field.getName();
                if (!fName.equals(fieldName)) {
                    continue;
                }

                //获取对应字段的属性描述器并获取get方法,使用invoke调用
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fName, object.getClass());
                Method getMethod = propertyDescriptor.getReadMethod();
                if (getMethod != null) {
                    return getMethod.invoke(object);
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

setValue():

    private void setValue(Object object, String fieldName, Object value){
        try{
            Field[] fields = object.getClass().getDeclaredFields();
            for (int i=0; i<fields.length; i++){
                String fName = fields[i].getName();
                if(!fName.equals(fieldName)){
                    continue;
                }

                //获取对应字段的属性描述器并获取set方法,使用invoke调用
                PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fName, object.getClass());
                Method setMethod = propertyDescriptor.getWriteMethod();
                if (setMethod != null) {
                    setMethod.invoke(object, value);
            break; } } }
catch (Exception e){ e.printStackTrace(); } }

 

参考:java利用反射交换两个对象中的字段相同的字段值 - 思思博士 - 博客园 (cnblogs.com)

posted @ 2023-06-24 23:12  一叶平易  阅读(658)  评论(0编辑  收藏  举报