利用反射为对象的某个字段赋值

随手记

主表A:tiger,panda,lion...等等字段(示例)

@Data
class A{

    String tiger;
    
    String panda;

    String lion;
}

现新增需求,每个动物,都要有对应解释。

在实际开发中,实际上表A字段很多,并且很多地方有引用该表,贸然新增字段,改动很大。

则新增扩展表,仅三个字段(其他固定字段不写了)

扩展表B: msg、msgType、main_id

@Data
class B{           
    /**
     * 动物解释
    **/
    String msg;
    /**
     * 动物的类型
     *  1:tiger
     *  2:panda
     *  3:lion
     */
    Integer msgType;   
    /**
    * 主表id
    */
    String mainId;
}

前端请求数据时,返回实体,要将所有数据组合起来。

返回实体如下:

@Data
class resultVo{
    

    String tiger;
    
    String tigerMsg;
    
    String panda;
    
    String pandaMsg;

    String lion;
    
    String lionMsg;
    
}

写个枚举:

       

@Getter
public enum AnimalMsgTypeEnum {

    TIGER("老虎",1,"tigerMsg"),

    PANDA("熊猫",2,"pandaMsg"),

    LION("狮子",3,"lionMsg");
    String msg;
    Integer value;
    String fieldName;

    AnimalMsgTypeEnum(String msg , Integer value,String fieldName){
        this.msg = msg;
        this.value = value;
        this.fieldName = fieldName;
    }

    /**
     * 通过value获取fieldName
     */
    public static String getFieldNameByValue(Integer value){
        for(AnimalMsgTypeEnummsgTypeEnum: values()){
            if(msgTypeEnum.getValue().equals(value)){
                return msgTypeEnum.getFieldName();
            }
        }
        return null;
    }

}

返回实体组合 利用反射为返回实体的字段赋值

    private resultVo setMsg( resultVo vo, List<B> messages) throws NoSuchFieldException, IllegalAccessException {
        if(messages != null && messages.size() > 0){
            //遍历 扩展表数据
            for (B message : messages) {
                //获取字段名
                String filedName = AnimalMsgTypeEnum.getFieldNameByValue(message.getMsgType());
                if(filedName != null){
                    try {
                        //利用反射为vo的字段赋值
                        Class<?> exportClass = vo.getClass();
                        Field field = exportClass.getDeclaredField(filedName);
                        field.setAccessible(true);
                        //为实体放入扩展表的值 
                        field.set(vo, message.getMsg());
                    }catch (Exception e){
                        log.info("setMsg reflect error",e);
                        e.printStackTrace();
                    }
                }

            }
        }
        return vo;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值