利用动态代理实现类中属性的动态生成。

使用场景:当不确定返回类中字段个数时,可使用动态生成属性个数实现需求。

 注意:由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

  1. 引入依赖

<dependency>    <groupId>cglibgroupId>    <artifactId>cglib-nodepartifactId>    <version>3.2.5version>dependency> <dependency>    <groupId>commons-beanutilsgroupId>    <artifactId>commons-beanutilsartifactId>    <version>1.9.3version>dependency><dependency>    <groupId>com.google.guavagroupId>    <artifactId>guavaartifactId>    <version>14.0version>dependency>

2、动态Bean

public class DynamicBean {    private Object target;    private BeanMap beanMap;    public DynamicBean(Class superclass, Map propertyMap) {        this.target = generateBean(superclass, propertyMap);        this.beanMap = BeanMap.create(this.target);    }    public void setValue(String property, Object value) {        beanMap.put(property, value);    }    public Object getValue(String property) {        return beanMap.get(property);    }    public Object getTarget() {        return this.target;    }    /**     * 根据属性生成对象     *     */    private Object generateBean(Class superclass, Map propertyMap) {        BeanGenerator generator = new BeanGenerator();        if (null != superclass) {            generator.setSuperclass(superclass);        }        BeanGenerator.addProperties(generator, propertyMap);        return generator.create();    }}

3、动态工具类 ReflectUtil

public class ReflectUtil {    private static Logger logger = LoggerFactory.getLogger(ReflectUtil.class);    public static Object getObject(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) -> {            String sclass = v.getClass().toString();            if(sclass.equals("class java.util.Date")) {//对日期进行处理                propertyMap.put(k, Long.class);            }else {                propertyMap.put(k, v.getClass());            }        });        DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);        propertyMap.forEach((k, v) -> {            try {                if (!addProperties.containsKey(k)) {                    dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k));                }            } catch (Exception e) {                logger.error("动态添加字段出错", e);            }        });        addProperties.forEach((k, v) -> {            try {                String sclass = v.getClass().toString();                if(sclass.equals("class java.util.Date")) {//动态添加的字段为date类型需要进行处理                    Date date = (Date) v;                    dynamicBean.setValue(k, date.getTime());                }else {                    dynamicBean.setValue(k, v);                }            } catch (Exception e) {                logger.error("动态添加字段值出错", e);            }        });        Object obj = dynamicBean.getTarget();        return obj;    }}

4、测试 TEST

//测试类public class User {     String userName;     Integer userAge;}
@GetMapping("cglib")public ResultData cglib (){    User user = new User();    Map<String,Object> propertiesMap = new HashMap<String,Object>();    Map<String,Object> hashMap = new HashMap<String,Object>();    for (int i = 0; i < 5; i++) {        propertiesMap.put("activity"+i, "活动"+i);    }    Object obj = ReflectUtil.getObject(user, propertiesMap);    return new ResultData().setData(obj);}

返回结果

遇到情况:利用 System.out.println(); 打印结果不会显示,只能在调用返回结果时,才会显示动态添加了类属性。

动态生成类_springboot动态生成类属性相关推荐

  1. Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c

    2019独角兽企业重金招聘Python工程师标准>>> 有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件. 那么技术实 ...

  2. 实体类的动态生成(三)

    前言 在 .NET 中主要有两种动态生成并编译的方式,一种是通过 System.Linq.Expressions 命名空间中的 LambdaExpression 类的 CompileToMethod( ...

  3. 实体类的动态生成(二)

    前言 实体类的动态生成(一)由于采用字典的方式来保存属性变更值的底层设计思想,导致了性能问题,虽然.NET的字典实现已经很高效了,但相对于直接读写字段的方式而言依然有巨大的性能差距,同时也会导致对属性 ...

  4. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  5. 实体类的动态生成(一)

    前言 在应用开发中,通常都会涉及各种 POJO/POCO 实体类(DO, DTO, BO, VO)的编写,有时这些实体类还需要实现 INotifyPropertyChanged 接口以支持属性变更通知 ...

  6. generator代码自动生成工具(动态生成注释、类注解、方法注解等)适用于swagger等需要配置实体类的场景

    generator代码生成器大家都不陌生,但是在实际的业务场景中,实体类只有属性.getter/setter方法不满足需求,还需要手动去添加需要的功能.比如项目使用swagger生成api文档时,需要 ...

  7. 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. Python动态类和动态方法的创建和调用

    借助于python的动态语言特性,很容易对对象进行添加方法或者属性,这也是python的灵活之一. 动态生成类的属性及其方法 在某些情况可能要根据不同的参数来动态生成不同的实例方法.静态方法.类方法. ...

  9. 【JVM】字节码与ASM字节码增强、Instrument实现类的动态重加载

    目录 字节码与ASM字节码增强 什么是字节码? 字节码结构 操作数栈与字节码 字节码增强 ASM 运行时类加载 Instrument JPDA与JVMTI instrument实现热加载的过程 字节码 ...

最新文章

  1. EID:宏基因组测序在新发腹泻病毒鉴定中的应用
  2. 经理=PD + Architect + PM + HR
  3. 没有任何基础的可以学python吗-没有任何基础的人,该如何学习Python?「附具体步骤」...
  4. 【计算理论】计算复杂性 ( 3-SAT 是 NP 完全问题 | 团问题是 NP 完全问题 | 团问题是 NP 完全问题证明思路 )
  5. Android开发学习笔记:Gallery和GridView浅析
  6. margin的塌陷现象
  7. python 测试mysql数据库_Python操作MySQL数据库----继续安装和测试
  8. 001.Linux开机启动过程
  9. linux yum c 11,CentOS YUM源安装 GVM-11 (一)
  10. html HTML 文本格式化
  11. 几种不同程序语言的HMM版本
  12. 苹果电脑有哪些很优秀的录屏软件呢?
  13. Node.js从入门到精通
  14. 通过浏览器中的F12中来查看接口的入参、出参和网页响应时间(新手教程)
  15. 蜗牛星际修改82583V网卡MAC地址
  16. Linux 重启nginx服务
  17. jshint详细说明【vscode插件】
  18. VUE开源项目大全地址
  19. http://blog.csdn.net/wxl1555/article/details/53916856
  20. Java发展前景及自学可行性分析

热门文章

  1. python一切皆对象_Python中一切皆为对象
  2. linux将程序锁死,Linux死锁现象及分析方法(转)
  3. mysql10038_navicat for mysql (10038)如何解决
  4. 安卓模拟器不能上网时可尝试更改成谷歌DNS
  5. python注销代码_django用户注册、登录、注销和用户扩展的示例
  6. sql:数据定义语言ddl
  7. 7-1:C++的IO流
  8. openjudge 放苹果 1664
  9. KVM 创建虚拟机时,--os-variant参数这样填写
  10. 安装rpm报错:requires Ruby version >= 2.*.*