docs: @SuppressWarnings({"rawtypes", "unchecked"})
      public static Object getClone(Object source) {
          if (null == source) {
              return null;
          }
          Object target = BeanUtils.getOneLayerClone(source);
  
          try {
              // 此处使用了JAVA的内省机制（内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法）
              // 获得对像的BeanInfo 信息：
              BeanInfo bi = Introspector.getBeanInfo(source.getClass());
              // 获得属性的描述器
              PropertyDescriptor[] props = bi.getPropertyDescriptors();
              for (int i = 0; i < props.length; ++i) {
                  if (null != props[i].getReadMethod()) {
                      Class propertyType = props[i].getPropertyType();
                      if (propertyType.equals(List.class)) {
                          List newList = new ArrayList();
                          // 此处使用了JAVA的反射机制通过获得方法的引用去执行方法，其中source:为要执行的方法所属的对象，
                          // 方法如果没有参数第二个参数则为null;
                          List valueList = (List) props[i].getReadMethod().invoke(source);
                          if (valueList == null) {
                              valueList = new ArrayList();
                          }
                          for (Object value : valueList) {
                              Object cloneValue = null;
                              if (value.getClass().getName().indexOf(ENTITY_CLASS_PACKAGE) >= 0) {
                                  cloneValue = BeanUtils.getOneLayerClone(value);
                              } else {
                                  cloneValue = value;
                              }
                              newList.add(cloneValue);
                          }
                          props[i].getWriteMethod().invoke(target, newList);
                      }
                      if (propertyType.equals(Set.class)) {
                          Set newSet = new HashSet();
                          Set valueSet = (Set) props[i].getReadMethod().invoke(source);
                          if (valueSet == null) {
                              valueSet = new HashSet();
                          }
                          for (Object value : valueSet) {
                              Object cloneValue = BeanUtils.getOneLayerClone(value);
                              newSet.add(cloneValue);
                          }
                          props[i].getWriteMethod().invoke(target, newSet);
                      } else {
                          // 如果是array 跳过 //FIXME
                          if (propertyType.equals(Arrays.class)) {
                              continue;
                          }
                          if (propertyType.toString().startsWith(ENTITY_CLASS_PACKAGE)) {
                              Object value = props[i].getReadMethod().invoke(source);
                              Object cloneValue = BeanUtils.getOneLayerClone(value);
                              props[i].getWriteMethod().invoke(target, cloneValue);
                          }
                      }
                  }
              }
          } catch (Exception e) {
              logger.error("clone object exception object class:" + source.getClass(), e);
          }
          return target;
      }