Java 为实体类动态添加属性

  1. 引入依赖
<!--使用cglib 为javabean动态添加属性-->
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
    </dependency>

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>3.2.4</version>
    </dependency>
  1. 工具类代码
  
   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;

    }
    }

import net.sf.cglib.beans.BeanGenerator;
import net.sf.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();
   }

}
public static void main(String[] args) {


        TestDTO entity = new TestDTO ();
        entity.setNumber(123);
        
        Map<String, Object> addProperties = new HashMap() {{
            put("动态属性名", 123);
        }};
        TestDTO dto = (TestDTO ) BeanAddPropertiesUtil.getTarget(entity, addProperties);


        System.out.println(JSON.toJSONString(dto));
    }
原文地址:https://www.cnblogs.com/mengzhao/p/14953322.html