1. 程式人生 > 其它 >JavaBean 動態 新增屬性 動態賦值

JavaBean 動態 新增屬性 動態賦值

/*
*@ClassName JavaFS
*@Description
*@Author LiuQi
*@Date 2022/4/12 11:12 上午
*@Version 1.0
*/

點選檢視程式碼
@ToString
@Data
public class JavaFS {
    private String name;
    private String sex;

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        JavaFS javaFS = new JavaFS();
        Field[] fields = javaFS.getClass().getDeclaredFields();
        for (Field declaredField : fields) {
            declaredField.setAccessible(true);
            System.out.println(declaredField.getName());
            System.out.println(JSON.toJSONString(declaredField));
        }
        System.out.println(javaFS);


        System.out.println("-----------=======----------========----------");

        Map<String, Object> addProperties = new HashMap<>();
        addProperties.put("age",18);
        addProperties.put("email","[email protected]");
        javaFS.setName("江小白");
        javaFS.setSex("男");
        JavaFS  fs = (JavaFS) ReflectUtil.getTarget(javaFS, addProperties);
        Field[] declaredFields = fs.getClass().getDeclaredFields();
        for (Field declaredField : declaredFields) {
            declaredField.setAccessible(true);
            System.out.println(JSON.toJSONString(declaredField.getName()));
        }

        System.out.println(JSON.toJSONString(fs));

    }





}
點選檢視程式碼
/**
 * 建立DynamicBean 類
 */
@ToString
 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
     */
    public 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();
    }


}
點選檢視程式碼
/**
 * 建立ReflecUtil轉換的工具類
 * 動態生成類的屬性、並且賦值
 */
@Slf4j
@ToString
 class ReflectUtil {

    public static Object getTarget(Object o, Map<String, Object> addProperties) {
        PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
        PropertyDescriptor[] propertyDescriptors = propertyUtilsBean.getPropertyDescriptors(o);
        Map<String, Class> propertyMap = new HashMap<>();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            if (!"class".equalsIgnoreCase(propertyDescriptor.getName())) {
                propertyMap.put(propertyDescriptor.getName(), propertyDescriptor.getPropertyType());
            }
        }
        // add extra properties
        addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
        // new dynamic bean
        DynamicBean dynamicBean = new DynamicBean(o.getClass(), propertyMap);
        // add old value
        propertyMap.forEach((k, v) -> {
            try {
                // filter extra properties
                if (!addProperties.containsKey(k)) {
                    dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(o, k));
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        });
        //add extra value
        addProperties.forEach((k, v) -> {
            try {
                dynamicBean.setValue(k, v);
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        });
        Object target = dynamicBean.getTarget();

        return target;

    }
}

注意:這個功能實現 通過 第三方依賴實現 依賴包 如下:

點選檢視程式碼
 <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.9</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId><details>
            <version>7.0</version>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.7.0</version>
            <scope>test</scope>
        </dependency>

<details>
文件地址:http://cglib.sourceforge.net/apidocs/net/sf/cglib/beans/BeanGenerator.html