不同类的属性值Copy工具类BeanCopyUtil

举报
轻狂书生FS 发表于 2020/12/02 23:45:32 2020/12/02
【摘要】 package com.zheng.ocr.common.util; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set; /...

      package com.zheng.ocr.common.util;
      import java.lang.reflect.Field;
      import java.lang.reflect.Method;
      import java.util.HashSet;
      import java.util.List;
      import java.util.Map;
      import java.util.Set;
      /**
       * @Author: 轻狂书生FS
       * @Description: 两个不同类属性Copy
       * @CreateDate: 2019/4/3 14:09
       * @Version: 1.0
       */
      public class BeanCopyUtil {
      private static String getGetMethodName(String fieldName) {
       fieldName = replaceFirstCharToUpper(fieldName);
      return "get" + fieldName;
       }
      private static String getSetMethodName(String fieldName) {
       fieldName = replaceFirstCharToUpper(fieldName);
      return "set" + fieldName;
       }
      private static String replaceFirstCharToUpper(String fieldName) {
      char[] chars = new char[1];
       chars[0] = fieldName.charAt(0);
       String temp = new String(chars);
      if (chars[0] >= 'a' && chars[0] <= 'z') {
       fieldName = fieldName.replaceFirst(temp, temp.toUpperCase());
       }
      return fieldName;
       }
      /**
       * @Author: 轻狂书生FS
       * @Description: 该方法接收两个参数,一个是复制的源对象——要复制的对象,一个是复制的目标对象——对象副本。
       * 当然这个方法也可以在两个不同对象间使用,这时候只要目标对象和对象具有一个或多个相同类型及名称的属性,
       * 那么就会把源对象的属性值赋给目标对象的属性
       * @params SourceBean源对象,
       * TargetBean目标对象,
       * @return TargetBean目标对象
       * @CreateDate: 2019/4/3 14:12
       * @Version: 1.0
       */
      public static <T> T getBean( T SourceBean,T TargetBean) throws Exception {
      if (TargetBean == null)
      return null;
       Field[] tFields = TargetBean.getClass().getDeclaredFields();
       Field[] sFields = SourceBean.getClass().getDeclaredFields();
      try {
      for (Field field : tFields) {
       String fieldName = field.getName();
      if (fieldName.equals("serialVersionUID"))
      continue;
      if (field.getType() == Map.class)
      continue;
      if (field.getType() == Set.class)
      continue;
      if (field.getType() == List.class)
      continue;
      for (Field sField : sFields) {
      if (!sField.getName().equals(fieldName)) {
      continue;
       }
       Class type = field.getType();
       String setName = getSetMethodName(fieldName);
       Method tMethod = TargetBean.getClass().getMethod(setName, new Class[] { type });
       String getName = getGetMethodName(fieldName);
       Method sMethod = SourceBean.getClass().getMethod(getName, null);
       Object setterValue = sMethod.invoke(SourceBean, null);
       tMethod.invoke(TargetBean, new Object[] { setterValue });
       }
       }
       } catch (Exception e) {
      throw new Exception("设置参数信息发生异常", e);
       }
      return TargetBean;
       }
      /**
       * @Author: 轻狂书生FS
       * @Description: 该方法接收三个参数,一个是复制的源对象——要复制的对象,一个是复制的目标对象——对象副本,一个是源对象与目标对象的属性映射关系
       * 本方法是一层拷贝,对象属性不包括集合类型的情况
       * 本方法有两种使用场景:
       * 一种是两个对象属性名相同时,可用; 一种是属性名字不同是,通过映射关系,也可用。
       * @params SourceBean源对象,
       * TargetBean目标对象,
       * map源对象与目标对象的属性映射关系,key:源对象属性值,value:目标对象属性值
       * @return TargetBean目标对象
       * @CreateDate: 2019/4/3 14:37
       * @Version: 1.0
       */
      public static <T> T getCopyBean(T SourceBean,T TargetBean, Map<String,String> map) throws Exception {
      if (TargetBean == null)
      return null;
      // 分别获取源对象和目标对象的属性
       Field[] tFields = TargetBean.getClass().getDeclaredFields();
       Field[] sFields = SourceBean.getClass().getDeclaredFields();
      // 将目标对象的属性名字放到Set集合
       Set<String> tFieldNames = new HashSet<>();
      for (Field field:tFields) {
       tFieldNames.add(field.getName());
       }
      try {
      // 遍历源对象属性
      for (Field field:sFields) {
       String fieldName = field.getName();
      if (fieldName.equals("serialVersionUID"))
      continue;
      if (field.getType() == Map.class)
      continue;
      if (field.getType() == List.class)
      continue;
      // 源对象的属性的名字是否在目标对象的属性值里面
      boolean isContains = tFieldNames.contains(fieldName);
       /**
       * 如果存在则源对象的属性值直接赋给目标对象
       * 如果不存在则通过映射关系将源对象的属性值赋给目标对象
       */
      if (isContains) {
       Class type = field.getType();
      // 获得目标对象属性的set方法
       String setName = getSetMethodName(fieldName);
       Method tMethod = TargetBean.getClass().getMethod(setName,new Class[]{type});
      // 获得源对象属性的get方法
       String getName = getGetMethodName(fieldName);
       Method sMethod = SourceBean.getClass().getMethod(getName,null);
      // 获得源对象的属性的属性值
       Object setterValue = sMethod.invoke(SourceBean,null);
      // 将setterValue赋给目标对象
       tMethod.invoke(TargetBean,new Object[]{setterValue});
       } else {
      // 判断map和map里面的key值是否为空
      if ((null == map) || (null == map.get(fieldName)))
      continue;
       Class type = field.getType();
      // 通过映射关系map获得目标对象属性的set方法
       String setName = getSetMethodName(map.get(fieldName));
       Method tMethod = TargetBean.getClass().getMethod(setName,new Class[]{type});
      // 获得源对象属性的get方法
       String getName = getGetMethodName(fieldName);
       Method sMethod = SourceBean.getClass().getMethod(getName,null);
       Object setterValue = sMethod.invoke(SourceBean,null);
       tMethod.invoke(TargetBean,new Object[]{setterValue});
       }
       }
       } catch (Exception e) {
      throw new Exception("设置参数信息发生异常", e);
       }
      return TargetBean;
       }
      }
  
 

 

文章来源: blog.csdn.net,作者:LookForDream_,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/LookForDream_/article/details/89082558

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。