• 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
  • 相关阅读:
    centos6 安装 directAdmin
    rpm源码安装mysql
    linux添加自启服务(程序)
    linux配置ip的方法
    开发规范
    Video Processing and Communications:(视频处理和通信)
    低清图像变成高清图像 原理
    CentOS和Ubuntu哪个好?
    遥感图像处理与一般的图像处理的区别
    GAE、SAE与BAE的对比分析(百度云)
  • 原文地址:https://www.cnblogs.com/LQ970811/p/16138560.html
Copyright © 2020-2023  润新知