Java怎样动态给对象添加属性并赋值【代码实现】
本篇文章主要介绍Java如何给已有实体类动态的添加字段并返回新的实体对象且不影响原来的实体对象结构。
参考代码如下:
引入依赖包
<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>
代码实现
DynamicBean.java
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;import java.util.Map;public 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);}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();}
}
ReflectUtil.java
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.PropertyUtilsBean;import java.beans.PropertyDescriptor;
import java.util.Date;
import java.util.Map;@Slf4j
public class ReflectUtil {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) -> {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) {log.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) {log.error("动态添加字段值出错", e);}});Object obj = dynamicBean.getTarget();return obj;}
}
使用示例
创建Student
实体类:
@Setter
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {private String name;
}
测试
@Slf4j
public class MyTest {public static void main(String[] args) {Student student = new Student();student.setName("公众号:小小开发者");log.info("student = {}",JSON.toJSONString(student));Map<String, Object> propertiesMap = new HashMap<>();propertiesMap.put("age", 25);Object obj = ReflectUtil.getTarget(student, propertiesMap);log.info("动态添加属性: = {}",JSON.toJSONString(obj));}
}
测试结果
student = {“name”:“公众号:小小开发者”}
动态添加属性: = {“age”:25,“name”:“公众号:小小开发者”}
可以看到,我们动态为对象添加的属性和属性值已经成功实现!
相关文章:
Java怎样动态给对象添加属性并赋值【代码实现】
本篇文章主要介绍Java如何给已有实体类动态的添加字段并返回新的实体对象且不影响原来的实体对象结构。 参考代码如下: 引入依赖包 <dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</…...

C#多线程同步lock、Mutex
C#使用多线程可以通过System.Threading命名空间下的Thread类来实现 lock和Mutex用于实现线程同步的机制: 上代码: class People{public People(int idd){id idd;}public int id;public int age;}class TestHelper{public TestHelper() { }List<Peo…...

模型实战(21)之 C++ - tensorRT部署yolov8-det 目标检测
C++ - tensorRT部署yolov8-det 目标检测 python环境下如何直接调用推理模型转换并导出:pt -> onnx ->.engineC++ tensorrt 部署检测模型不写废话了,直接上具体实现过程+all代码 1.Python环境下推理 直接命令行推理,巨简单yolo detect predict model=yolov8n.pt source…...
Linux完整版命令大全(二十一)
mkswap 功能说明:设置交换区(swap area)。语 法:mkswap [-cf][-v0][-v1][设备名称或文件][交换区大小]补充说明:mkswap可将磁盘分区或文件设为Linux的交换区。参 数: -c 建立交换区前,先检查是否有损坏的区…...

Elasticsearch集群许可证过期问题解决方法汇总
最近在使用elasticsearch的过程中,使用elastic-head进行可视化展示集群的状态和信息,从2024年5月18日突然elastic-head无法现在集群的状态界面啦,elasticsearch集群状态是正常,命令如下: curl -X GET "localhost:9200/_cluster/health?pretty" 在google页面上通过…...
Golang实现根据文件后缀删除文件和递归删除文件
概述 这个功能会非常强大,因为在日常工作中,我通常会遇到需要批量删除文件的场景,通过这个方法,再结合我的另一个 命令行开发框架,能够很轻松的开发出这个功能。 代码 package zdpgo_fileimport ("errors"…...

Python OCR 文字识别使用模型:读光-文字识别-行识别模型-中英-通用领域
介绍 什么是OCR? OCR是“Optical Character Recognition”的缩写,中文意为“光学字符识别”。它是一种技术,可以识别和转换打印在纸张或图像上的文字和字符为机器可处理的格式,如计算机文本文件。通过使用OCR技术,可…...

Python | Leetcode Python题解之第105题从前序与中序遍历序列构造二叉树
题目: 题解: class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if not preorder:return Noneroot TreeNode(preorder[0])stack [root]inorderIndex 0for i in range(1, len(preorder)):preorderVal pr…...
经典面试题:什么是事物的隔离级别?什么是MVCC?
目录 前言一、事物的隔离级别二、隔离级别是如何实现的1. 锁定技术2. 多版本并发控制(MVCC)基本原理实现机制优缺点 3. 乐观锁与悲观锁 三、MySQL设置隔离级别MySQL数据库Java (使用JDBC) 前言 事务的四大特性(ACID特性)…...
Java程序中,不同jar包,有2个完全相同的类,运行时的加载顺序
在Java程序中,如果有两个完全相同的类存在于不同的jar包中,那么在运行时究竟加载哪个类,主要取决于类加载器的类路径(Classpath)搜索顺序。 Java使用类加载器(ClassLoader)来动态加载类。当Jav…...

EI期刊的定金和尾款
当涉及到EI(工程索引)期刊发表并支付定金和尾款时,许多学者和研究人员可能会感到担忧,因为这涉及到一定的风险。在探讨这个话题时,我们需要考虑几个因素,包括期刊的声誉、可信度、出版质量以及作者的权益保…...

python+pytest+pytest-html+allure集成测试案例
pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/ │ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── tests/ │ ├── __init__.py │ ├── conftest.p…...

STL-priority_queue的使用及其模拟实现
优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。 注意࿱…...

pycharm连接阿里云服务器过程记录
因为不想用自己的电脑安装anaconda环境,所以去查了一下怎么用服务器跑代码,试着用pycharm连接阿里云服务器,参考了很多博客,自己简单配置了一下,记录一下目前完成的流程. 主要是:阿里云服务器的远程登录和安装anaconda,以及怎么用pycharm连接阿里云服务器上的解释器. 小白刚开始…...

移动硬盘未格式化数据恢复及预防策略
随着数字化时代的到来,移动硬盘作为数据存储的重要载体,被广泛应用于个人和企业中。然而,当移动硬盘遭遇“未格式化”的困境时,其中的数据便岌岌可危。本文将深入探讨移动硬盘未格式化的现象、原因、数据恢复方案以及预防措施&…...
MySQL数据库入门之视图、存储过程、触发器
一、视图: 1.1、视图是什么?怎么理解? 视图是从数据库的基本表(或者视图)导出的虚表(数据库只放定义,它不实际存储数据,而是根据用户定义的SQL查询动态生成的结果集,具…...

Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略
文章目录 1、代码演示1.1、pom.xml1.2、KafkaProducerPartitioningStrategy.java1.2.1、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况,不轮询1.2.2、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况,轮询1.2.3、ProducerConfig.LINGER_MS_CONFIG取 1000…...

网页中的音视频裁剪拼接合并
一、需求描述 项目中有一个配音需求: 1)首先,前台会拿到一个英语视频,视频的内容是A和B用英语交流; 2)然后,用户可以选择为某一个角色配音,假如选择为A配音,那么视频在播…...
【入门】使用sklearn实现的KNN算法:鸢尾花数据集分类预测
目录 前言 第一步:安装和导入sklean模块 第二步:获取数据 第二步:分割出训练集和测试集 第三步:训练模型 第四步:测试结果 总结 前言 本文将介绍如何利用K最近邻(KNN)算法对经典的鸢尾花数…...

nss做题
[NCTF 2018]签到题 1.f12在index.php中找到flag [NSSCTF 2022 Spring Recruit]ezgame 1.在js源码中就有flag [UUCTF 2022 新生赛]websign 1.打开环境后发现ctrlu和右键,f12都被禁用了。两种方法,第一种:禁用js;第二中提前打开…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...