首页 > 编程语言 >Java 动态代理给对象插入动态属性

Java 动态代理给对象插入动态属性

时间:2024-04-10 09:33:38浏览次数:25  
标签:Map Java Object propertyMap 插入 entry import 动态 public

package com.gwm.gwmcenterbudget.projectbudget.client.api.dto;

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添加字段
 */

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 添加属性和值
         */

        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<String, Class<?>> propertyMap) {

            BeanGenerator generator = new BeanGenerator();

            if (null != superclass) {

                generator.setSuperclass(superclass);

            }

            BeanGenerator.addProperties(generator, propertyMap);

            return generator.create();

        }

    }

}

  

       map.put("测试-动态字段-展示", "测试值");
            Object obj = DynamicBeanUtils.getTarget(对象, map);
 <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>

 

标签:Map,Java,Object,propertyMap,插入,entry,import,动态,public
From: https://www.cnblogs.com/ynhk/p/18125352

相关文章

  • 排序之插入排序和交换排序
    排序的分类内部排序插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序简单选择排序堆排序⭐归并排序基数排序外部排序插入排序直接插入排序在待排序的元素序列基本有序的前提下,直接插入排序是效率最高的排序算法利用直接插入排序的......
  • 详解Java Chassis 3与Spring Cloud的互操作
    本文分享自华为云社区《JavaChassis3技术解密:与SpringCloud的互操作》,作者:liubao68。JavaChassis3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。本文在这个架构原则基础上,讨论......
  • 最短编辑距离(线性dp)-java
    最短编辑问题也是一种非常经典的二维线性dp问题。 文章目录前言一、最短编辑距离问题二、算法思路1.dp[i][j]的情况 2.边界问题初始化3.状态转移方程三、代码如下1.代码如下2.读入数据3.代码运行结果总结前言最短编辑问题也是一种非常经典的二维线性dp问......
  • Java入门基础知识第八课(数组)——冒泡排序、Arrays工具类
    前面二白讲了关于数组的概念、语法以及简单的输入输出,实际上关于数组的知识还有很多,接下来咱们讲一下冒泡排序以及一些常用的Arrays工具类,需要记忆的知识很多,而且容易混淆。一、冒泡排序简介(原理)升序为例:从头开始,每次比较相邻两数小的交换到前面每轮结束后最大的数交换到......
  • 【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)
      ......
  • 棋盘进行黑白染色(java)
    【题目】 有一个n*m的棋盘,现在对这个棋盘进行黑白染色,左上角染成黑色。从左上角开始,每个黑色格的相邻格染成白色,白色格的相邻格染成黑色。以下给出了一个5*7的棋盘的染色示例。给定n和m,请问棋盘上一共有多少方格被染成了黑色。【代码】publicclassTest13{public......
  • 基于java的文物管理系统
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9页面展示用户前台功能模块文物管理系统,在系统首页可以查看首页、文物信息、论坛交流、文物资讯、留言反馈......
  • 基于java&ssm&JSP的教学质量评价系统
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示管理员功能模块管理员登录,通过填写用户名、密码等信息,输入完成后选择登录即可进入教学质量评价系......
  • 基于java&ssm实现的农产品供销服务系统
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示用户前台功能模块农产品供销服务系统,在系统首页可以查看首页、农产品、农产品资讯、我的、跳转到......
  • 基于java & JSP 实现的固定资产管理系统
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7数据库工具:Navicat11开发软件:eclipse/myeclipse/idea系统展示前台首页功能模块固定资产管理系统,在系统首页可以查看首页、设备信息、论坛信息、我的、跳转到后台等内容前台首页功能界面图注......