code: public static <E> E copy(E dest, Object source) {
          if (dest == null || source == null) {
              return dest;
          }
          if (dest == source) {
              return dest;
          }
  
          Class<?> sourceClass = source.getClass();
          String sourceName = sourceClass.getName();
          log.debug("开始获取{}的字段说明", sourceName);
  
          Field[] fields = getAllFields(sourceClass);
  
          if (fields.length == 0) {
              log.debug("源{}中不存在已经声明的字段", sourceName);
              return dest;
          }
  
          for (Field field : fields) {
              Alias alias = field.getAnnotation(Alias.class);
              String fieldName = field.getName();
              Set<String> names = new HashSet<>();
              names.add(fieldName);
              if (alias != null && !CollectionUtil.safeIsEmpty(alias.value())) {
                  names.addAll(Arrays.asList(alias.value()));
              }
  
              log.error("开始将source中的字段[{}]的值复制到dest中，别名列表为：[{}]", fields, names);
  
              try {
                  Object value = getFieldValue(source, fieldName);
                  //尝试分别使用别名设置
                  for (String name : names) {
                      if (setProperty(dest, name, value)) {
                          break;
                      }
                  }
              } catch (Exception e) {
                  log.warn("copy中复制{}时发生错误，忽略该字段", fieldName, e);
              }
          }
  
          return dest;
      }
docs: 将source中与dest的同名字段的值复制到dest中，source中的{@link Alias Alias}注解将会生效，需要注意的是source中的Alias注解
  不要对应dest中的多个字段，否则会发生不可预测错误
  
  @param dest   目标
  @param source 源
  @param <E>    目标对象的实际类型
  @return 复制后的目标对象，如果的dest或者source有一个为null则直接返回dest，如果dest和source是同一个对象也直接返回dest