软件编程
位置:首页>> 软件编程>> java编程>> Java为实体类动态添加属性的方法详解

Java为实体类动态添加属性的方法详解

作者:执拗的小豆芽  发布时间:2023-09-01 05:31:43 

标签:Java,实体类,动态,添加,属性

可以给已有实体类动态的添加字段并返回新的实体对象,不影响原来的实体对象结构。

添加依赖

<dependency>
           <groupId>cglib</groupId>
           <artifactId>cglib</artifactId>
           <version>2.2.2</version>
       </dependency>

<dependency>
           <groupId>commons-beanutils</groupId>
           <artifactId>commons-beanutils</artifactId>
           <version>1.9.4</version>
       </dependency>

代码

import com.google.common.collect.Maps;
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.beans.PropertyDescriptor;
import java.util.Map;

/**
* 动态为bean添加字段
* @Author gongl
* @Create 2022-01-11
*/
public class DynamicBeanUtils {

private static final Logger logger = LoggerFactory.getLogger(DynamicBeanUtils.class);

public static Object getTarget(Object dest, Map<String, Object> addProperties) {
       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());
           }
       }
       addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
       //构建新的对象
       DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);
       for (Map.Entry<String, Class<?>> entry : propertyMap.entrySet()) {
           try {
               if (!addProperties.containsKey(entry.getKey())) {//原来的值
                   dynamicBean.setValue(entry.getKey(), propertyUtilsBean.getNestedProperty(dest, entry.getKey()));
               }else {//新增的值
                   dynamicBean.setValue(entry.getKey(), addProperties.get(entry.getKey()));
               }
           } catch (Exception e) {
               logger.error(e.getMessage(), e);
           }
       }
       return dynamicBean.getTarget();
   }

private static 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 class TestBean{
       private String name;

public String getName() {
           return name;
       }

public void setName(String name) {
           this.name = name;
       }
   }
   public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
       TestBean bean = new TestBean();
       bean.setName("张三");
       Map<String, Object> map = new HashMap<>();
       map.put("age", 29);
       //添加参数age--->29
       Object obj = DynamicBeanUtils.getTarget(bean, map);
       //打印结果
       Method[] declaredMethods = obj.getClass().getDeclaredMethods();
       for(Method method:declaredMethods){
           if(method.getName().startsWith("get")){
               Object o=method.invoke(obj);
               System.out.println("属性值get方法->"+o);
           }
       }
   }

结果打印出name和age的值

Java为实体类动态添加属性的方法详解

来源:https://blog.csdn.net/weixin_47914635/article/details/123550354

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com