zoukankan      html  css  js  c++  java
  • 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));
        }
    
  • 相关阅读:
    MVC NonAction属性
    未将对象引用设置到对象的实例
    回调函数callback
    Json详解
    浅谈HTTP中Get与Post的区别
    JQuery $.ajax()方法详解
    C#中Const和Readonly的区别
    全面解释StringBuilder、StringBuffer和String的关系
    基本数据类型的包装类和随机数
    枚举类的使用
  • 原文地址:https://www.cnblogs.com/mengzhao/p/14953322.html
Copyright © 2011-2022 走看看