Java动态增加实体类的属性
1、DynamicBean
import org.springframework.cglib.beans.BeanGenerator; import org.springframework.cglib.beans.BeanMap; import java.util.Map; public class DynamicBean { /** * 目标对象 */ private Object target; /** * 属性集合 */ private BeanMap beanMap; public DynamicBean(Class superclass, Map<String, Class> propertyMap) { this.target = generateBean(superclass, propertyMap); this.beanMap = BeanMap.create(this.target); } /** * bean 添加属性和值 * * @param property * @param value */ public void setValue(String property, Object value) { beanMap.put(property, value); } /** * 获取属性值 * * @param property * @return */ public Object getValue(String property) { return beanMap.get(property); } /** * 获取对象 * * @return */ public Object getTarget() { return this.target; } /** * 根据属性生成对象 * * @param superclass * @param propertyMap * @return */ private Object generateBean(Class superclass, Map<String, Class> propertyMap) { BeanGenerator generator = new BeanGenerator(); if (null != superclass) { generator.setSuperclass(superclass); } BeanGenerator.addProperties(generator, propertyMap); return generator.create(); } }
2、BeanAddPropertiesUtil
import com.google.common.collect.Maps; import org.apache.commons.beanutils.PropertyUtilsBean; import java.beans.PropertyDescriptor; import java.util.Map; public class BeanAddPropertiesUtil { public static Object getTarget(Object dest, Map<String, Object> addProperties) { // get property map PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean(); PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest); Map<String, Class> propertyMap = Maps.newHashMap(); for (PropertyDescriptor d : descriptors) { if (!"class".equalsIgnoreCase(d.getName())) { propertyMap.put(d.getName(), d.getPropertyType()); } } // add extra properties addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass())); // new dynamic bean DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap); // add old value propertyMap.forEach((k, v) -> { try { // filter extra properties if (!addProperties.containsKey(k)) { dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k)); } } catch (Exception e) { e.printStackTrace(); } }); // add extra value addProperties.forEach((k, v) -> { try { dynamicBean.setValue(k, v); } catch (Exception e) { e.printStackTrace(); } }); Object target = dynamicBean.getTarget(); return target; } }
3、实际运用:
OrderUserOrderMerchantDTO orderMerchantDTO = new OrderUserOrderMerchantDTO (); orderMerchantDTO.setRealName(***); Map<String, Object> map = new HashMap<>(); //通过list动态添加属性 if (CollectionUtils.isNotEmpty(orderMerchandiseList)) { List<String> orderNumberList = orderMerchandiseList.stream().map(OrderUserOrderMerchandiseVO::getOrderNumber).collect(Collectors.toList()); for (int i = 0, j = orderNumberList.size(); i < j; i++) { map.put("orderNumber" + i, orderNumberList.get(i)); } } OrderUserOrderMerchantDTO merchantDTO = (OrderUserOrderMerchantDTO) BeanAddPropertiesUtil.getTarget(orderMerchantDTO, map); //增加后的实体对象引用 String jsonStr = toJSONString(merchantDTO);
下一篇:
autojs 捕获异常并处理