美文网首页
Java cglib为实体类(javabean)动态增加属性

Java cglib为实体类(javabean)动态增加属性

作者: writeanewworld | 来源:发表于2020-07-01 10:38 被阅读0次

1.应用场景

image.png

之前对接三方平台遇到一个参数名称是变化的,然后我就想到了动态javabean怎么生成,其实是我想多了,用个map就轻易解决了,但还是记录下动态属性添加的实现吧。

2.引入依赖

   <!--使用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>

3.代码如下

    import com.freemud.waimai.menu.dpzhcto.dto.DynamicBean;
    import com.google.common.collect.Maps;
    import org.apache.commons.beanutils.PropertyUtilsBean;
    import java.beans.PropertyDescriptor;
    import java.util.Map;

     public class PicBeanAddPropertiesUtil {

     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) {


        FinalPicBaseReqDto entity = new FinalPicBaseReqDto();
        entity.setAppKey("eee");
        entity.setContent("222");
        Map<String, Object> addProperties = new HashMap() {{
            put("动态属性名", "动态属性值");
        }};
        FinalPicBaseReqDto finalPicBaseReqVo = (FinalPicBaseReqDto) PicBeanAddPropertiesUtil.getTarget(entity, addProperties);


        System.out.println(JSON.toJSONString(finalPicBaseReqVo));
    }
image.png image.png

可以看到实体类只有两个属性,但是最终是动态添加进去了新的属性。
声明:代码也是前人造的轮子,欢迎各位拿去使用,解决实际生产中遇到的相似场景问题

相关文章

  • Java cglib为实体类(javabean)动态增加属性

    1.应用场景 之前对接三方平台遇到一个参数名称是变化的,然后我就想到了动态javabean怎么生成,其实是我想多了...

  • 使用cglib 动态为对象增加属性

    一. 目的 有时候我们可能面临这样的需求,即在运行时给一个对象增加属性,或者在运行时创建一个对象,一个应用场景就是...

  • java动态增加方法

    java动态增加方法 借鉴了spring devtool的热部署思想,通过使用javassist或者cglib来实...

  • 常用工具

    在线JSON字符串转Java实体类(JavaBean、Entity)

  • 源码基础 -- 动态代理(2)

    再看java动态代理之Cglib动态代理,早期大家选择Cglib主要是因为Cglib底层采用ASM字节码生成框架,...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • JavaWeb - JavaBean

    JavaBean 实体类JavaBean 有特定的写法: 必须要有一个无参构造 属性必须私有化 必须有对应的get...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • JavaWeb之JavaBean

    九、JavaBean 实体类JavaBean有特定的写法:①必须要有一个无参构造②属性必须私有化③必须有对应的ge...

网友评论

      本文标题:Java cglib为实体类(javabean)动态增加属性

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