将对象的属性值复制到另一个对象中

/**** 将第一个对象的属性值复制到第二个对象中* @param <T> 第一个对象* @param <R> 第二个对象*/
class HandleObject<T,R>{//保存指定不同的字段名称和数据类型private List<Attribute> attributes;/*** 存放两个对象的字段和字段类型*/private class Attribute {private String fieldOne;private String fieldTwo;private Class<?> type;Attribute(){}Attribute(String fieldOne, String fieldTwo, Class<?> type){this.fieldOne = fieldOne;this.fieldTwo = fieldTwo;this.type = type;}}/*** 初始化不指定大小*/HandleObject(){this.attributes = new ArrayList<>();}/*** 初始化时指定大小* @param size*/HandleObject(Integer size){this.attributes = new ArrayList<>(size);}/**** 指定对象的字段* @param fieldOne 第一个对象的字段* @param fieldTwo 第二个对象的字段* @param type 第二个字段的数据类型*/public void add(String fieldOne,String fieldTwo,Class<?> type){this.attributes.add(new Attribute(fieldOne,fieldTwo,type));}/**** 对象属性值赋值* @param data 第一个对象* @param noData 第二个对象* @return 第二个对象* @throws Exception*/public R serviceWrite(T data, Class<R> noData) throws Exception {return this.serviceWrite(data,noData,this.attributes);}/*** 对象属性值赋值* @param data 第一个对象* @param noData 第二个对象* @param list 指定字段* @return 第二个对象* @throws Exception*/private R serviceWrite(T data, Class<R> noData, List<Attribute> list) throws Exception {//获取操作类反射对象Class<?> cls = data.getClass();Class<?> claData = Class.forName(noData.getName());//获取实例Object newInstance = claData.newInstance();//获取所有属性名称Field[] fields = cls.getDeclaredFields();Field[] declaredFields = claData.getDeclaredFields();//循环赋值(属性和类型相同情况)for (Field field : fields) {for (Field fieldLess : declaredFields) {//属性名称String name = field.getName();//属性类型String type = field.getType().getName();//禁止安全检查,可以提高性能field.setAccessible(true);//取出需要赋值进去的对象属性和类型String lessName = fieldLess.getName();String lessType = fieldLess.getType().getName();//判断属性名和类型都相同就赋值if (name.equals(lessName) && type.equals(lessType)){//赋值Method setMet = claData.getDeclaredMethod("set" + initcap(lessName), lessType.getClass()) ;//从data对象中取出值赋值到noDatasetMet.invoke(newInstance,field.get(data));}//判断是否为非属性赋值}}//循环遍历指定的字段赋值if (list.size() > 0 && null != list){list.forEach(action ->{try {//根据属性名取出属性值Method getMethod = cls.getDeclaredMethod("get" + initcap(action.fieldOne));//赋值Method setMethod = claData.getDeclaredMethod("set" + initcap(action.fieldTwo), action.type);setMethod.invoke(newInstance,getMethod.invoke(data));}catch (Exception e){new RuntimeException("赋值错误" + e.getMessage());}});}return (R) newInstance;}/**** 首字母大写操作* @param str 转大写的字符串* @return*/public static String initcap(String str) {return str.substring(0, 1).toUpperCase() + str.substring(1) ;}
}
  • 创建第一个类
public class Book {private String name ;private String title ;private Integer price ;//get and set 方法略
}
  • 创建第二个类
public class School{private String name ;private String className;private Integer classCount ;//get and set 方法略
}
  • 创建测试方法
public static void main(String[] args) {try {Book book = new Book();book.setName("领域驱动模型设计");book.setTitle("复杂也业务设计");book.setPrice(589);/**** 将Book对象的数据复制到School中* 并指定属性名(如果不指定属性名,对象的属性名不同的地方就不能复制过去)*/HandleObject<Book, School> attribute = new HandleObject<>(2);attribute.add("title", "className", String.class);attribute.add("price", "classCount", Integer.class);School school = attribute.serviceWrite(book, School.class);System.out.println("name:" + school.getName() + "className:" + school.getClassName() + "count:" + school.getClassCount());//打印结果:name:领域驱动模型设计className:复杂也业务设计count:589} catch (Exception e) {e.printStackTrace();}}

使用Spring中BeanUtils方法实现

Book book = new Book();
book.setName("领域驱动模型设计");
book.setTitle("复杂也业务设计");
book.setPrice(589);School school = new School();//赋值所有相同的字段
BeanUtils.copyProperties(book,school);//忽略掉 不需要赋值的字段(name)
BeanUtils.copyProperties(book,school,null,"name");
System.out.println("name:" + school.getName() + "className:" + school.getClassName() + "count:" + school.getClassCount());

BeanUtils所在类

org.springframework.beans.BeanUtils;

转载请指明……

将对象的属性值复制到另一个对象中相关推荐

  1. java bean对象属性复制,将一个对象的属性值赋值给另一个对象,对象之间的复制方法

    注意依赖,springframework下的复制顺序为 (目标对象,新对象) import org.springframework.beans.BeanUtils;public static void ...

  2. java对象上有横线_对象bean间属性值复制:无视大小写和下划线_和横杠-

    1.简要说明:在java代码开发过程中,总会遇到实体类bean直接的属性复制问题,将一个bean中的值复制到另一个bean中,这时如果属性名是形同的,(仅仅有大小写或带下划线_或带横杠-)的区别,那就 ...

  3. 通过List里面对象的属性值来去重List,并把相同属性的其他属性相加

    最近在做一个大的项目,其中有一个通过List里面对象的属性值来去重List,并把相同属性的其他属性相加,都说通过Map的key唯一,来去重.记录一下 首先有一个实体类User package com. ...

  4. 根据数组中对象的属性值排序倒叙

    数组中对象的属性值排序倒叙demo function compare(e) {return function (a, b) {var value1 = a[e];var value2 = b[e];r ...

  5. JS 中对数组按照数组中某个对象的属性值进行排序

    最近遇到了按照数组中某个对象的属性值进行排序的需求,找了很多种方式,下面这个完美解决: arr是数组名,attr是数组某个对象的属性 完美解决~~ 转载于:https://www.cnblogs.co ...

  6. JS-面向对象-函数的使用场景---作为其他变量的值 / 作为对象的属性值 / 作为其他函数的参数 / 作为其他函数的返回值 / 作为构造函数(定义对象)

    作为其他变量的值 <!DOCTYPE html> <html lang="zh"><head><meta charset="UT ...

  7. Java 用反射设置对象的属性值

    为什么80%的码农都做不了架构师?>>>    /*** 用反射设置对象的属性值* @param obj 需要設置值的對象* @param fieldName 需要設置值的屬性* @ ...

  8. js删除对象空属性值的方法

    1.删除对象空属性值 正常情况下,拿到的数据是{01:["鹿晗","关晓彤"]} 但当用户更改选项之后,我们可能拿到数据就是{01:[]},01的属性值是空的, ...

  9. JQuery修改对象的属性值

    JQuery修改对象的属性值 用到的便是JQuery提供的attr方法,获取属性值的基本结构为:$(obj).attr("属性名"):修改属性值的结构为:$(obj).attr(& ...

最新文章

  1. mysql嵌套实战_艰难的mysql嵌套表结果挑战
  2. pbar PermissionError
  3. boost::function_types::is_function_reference的测试程序
  4. centos下git clone报401错误解决办法
  5. javascript操作dom的一些函数
  6. Java加密与解密的艺术~思维导图
  7. amd cpu排行_最新AMD CPU排行出炉 E6版3000+夺魁
  8. about the libiconv.2.dylib
  9. Python基本输出函数print()用法小结
  10. 校招 C++ 大概学习到什么程度?
  11. js 操作字符串方法记录
  12. VSFTPD 上传文件 200 227 553错误
  13. 飞猪研报:知识xingqiu
  14. Ruby(了解第二天)
  15. android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
  16. Android中全局搜索(QuickSearchBox)详解(一)
  17. Qt中 gui 模块和 widgets 模块的区别
  18. 淘宝运营 钻展、智钻的定义 优势所在
  19. ubuntu训练深度学习模型电脑重启解决方法
  20. MonoDETR:用于单目3D检测的深度感知transformer(CVPR2022)

热门文章

  1. Hive中orderBy,sortBy,distribute by,cluster by,group by
  2. 爬取了知乎2.2亿阅读量 有漂亮女朋友是什么体验,结果发现...
  3. 微信读书vscode插件_曾经我以为 VSCode 是程序员专属的工具,直到发现了这些……...
  4. 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
  5. Cesium 视频融合,边缘模糊
  6. 关于光通信的最强进阶科普
  7. UML图六种箭头含义
  8. OCR文本图像合成工具
  9. 配音兼职平台有那些,配音兼职靠谱的平台?
  10. trim函数去除空格(所有空格,前后,前,后)以及字母大小写切换