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","xxxxxx@qq.com");
        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
posted @ 2022-04-13 08:40  葵儿啊  阅读(1032)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/