美文网首页
对象字段赋值 - ReflectionUtils

对象字段赋值 - ReflectionUtils

作者: Tinyspot | 来源:发表于2023-11-09 09:40 被阅读0次

使用 spring-core 里的 ReflectionUtils 类

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.springframework.util.ReflectionUtils;
// ...

public class UpdateField {

    @Test
    public void demo() {
        String extendCondition = "orderCode=1002;orderStatus=100;tradeId=null";
        // 解析
        Map<String, String> params = new HashMap<>();
        if (extendCondition.trim().contains(";")) {
            String[] conditionArray = extendCondition.trim().split(";");
            for (String item : conditionArray) {
                if (StringUtils.isNotEmpty(item) && item.contains("=")) {
                    params.put(item.split("=")[0].trim(), item.split("=")[1].trim());
                }
            }
        }
    
        OrderDTO orderDTO = new OrderDTO("1001", "20230101001");
        updateFields(orderDTO, params);
    
        System.out.println(orderDTO);
    }

    /**
     * 关键字不做解析
     */
    private static final List<String> KEY_WORDS = Arrays.asList("orderId", "orderCode");

    public static void updateFields(Object object, Map<String, String> params) {
        if (object == null || MapUtils.isEmpty(params)) {
            return;
        }

        for (Map.Entry<String, String> entry : params.entrySet()) {
            String key = StringEscapeUtils.unescapeHtml4(StringEscapeUtils.escapeHtml4(entry.getKey()));
            if (KEY_WORDS.contains(key)) {
                continue;
            }
            String value = params.get(key);
            if (StringUtils.isBlank(value)) {
                continue;
            }
            Field field = ReflectionUtils.findField(object.getClass(), key);
            if (field == null) {
                continue;
            }
            field.setAccessible(true);
            if (StringUtils.equals(value, "null")) {
                ReflectionUtils.setField(field, object, null);
            } else {
                Class<?> fieldType = field.getType();
                if (String.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, value);
                } else if (Integer.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Integer.parseInt(value));
                } else if (Long.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Long.parseLong(value));
                } else if (Date.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, new Date(Long.parseLong(value)));
                } else if (Double.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Double.parseDouble(value));
                } else if (Float.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Float.parseFloat(value));
                } else if (Short.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Short.parseShort(value));
                } else if (Byte.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Byte.parseByte(value));
                } else if (Boolean.class.isAssignableFrom(fieldType)) {
                    ReflectionUtils.setField(field, object, Boolean.valueOf(value));
                }
            }
        }
    }
    
}
@Data
public class OrderDTO {
    private Integer orderId;
    private String orderCode;
    private String tradeId;
    private Integer orderStatus;

    public OrderDTO(String orderCode, String tradeId) {
        this.orderCode = orderCode;
        this.tradeId = tradeId;
    }
}

打印对象:
OrderDTO(orderId=null, orderCode=1001, tradeId=null, orderStatus=100)

相关文章

  • 说一说反射机制在zuul的类ZuulFilterInitiali

    spring的工具类ReflectionUtils 先查找到目标域 然后修改为可访问状态 最后得到对象,执行对象的...

  • Python 反射机制

    有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并...

  • 【JAVA】Java中的this关键字

    0x01 This关键字 在方法中加入this,代表直接给对象当中的字段赋值。 this是当前正在使用的对象的地址...

  • mysql表管理

    管理表结构:1.插入 添加一条记录,给所有字段赋值 添加一条记录,指定字段赋值ps:字段值要与字段类型相匹配 字符...

  • 筛选对象数组里边几个特定的字段,形成一个新的数组

    数组长这样,我要拿其中的businessId、businessName、cat_num字段,赋值给一个新得数组对象...

  • Mybatis通用JsonTypeHandler

    需求 有的对象字段需要存储为Json,可以直接转成Json赋值后再保存。也可以通过Mybatis的TypeHand...

  • 功能代码块

    获取当前时间的前或后n个小时 忽略对象字段转json及忽略json field对应赋值给object field

  • Runtime二 之让子对象自动实现copy/mutableco

    我们经常会遇到对象需要copy的时候,也许你会写一个私有方法为新建对象的所有字段赋值,当然没问题,但是当一个对象有...

  • 优雅编程之builder模式

    问题场景 有如下一个Person类,包含姓名、年龄、住址、电话字段,创建Person类时,要对属性赋值,并且在对象...

  • 解构赋值

    解构赋值 数组的解构赋值 嵌套,默认值,展开符 对象的解构赋值 对象解构赋值的本质与简写 对象解构的模式与变量 对...

网友评论

      本文标题:对象字段赋值 - ReflectionUtils

      本文链接:https://www.haomeiwen.com/subject/yvscwdtx.html