docs: public static <T> T copy(Object src, T dest, boolean setDefaultValForNull) throws BeanConverterException {
          if (src == null)
              return null;
  
          try {
              Class<? extends Object> destClass = dest.getClass();
              Map<String, PropertyDescriptor> srcDescriptors = getCachePropertyDescriptors(src.getClass());
              Map<String, PropertyDescriptor> destDescriptors = getCachePropertyDescriptors(destClass);
  
              Set<String> keys = destDescriptors.keySet();
              for (String key : keys) {
                  PropertyDescriptor srcDescriptor = srcDescriptors.get(key);
  
                  if (srcDescriptor == null)
                      continue;
  
                  PropertyDescriptor destDescriptor = destDescriptors.get(key);
  
                  Object value = srcDescriptor.getReadMethod().invoke(src);
  
                  Class<?> propertyType = destDescriptor.getPropertyType();
  
                  Method writeMethod = destDescriptor.getWriteMethod();
                  if (writeMethod == null) {
                      String name = destDescriptor.getName();
                      try {
                          writeMethod = destClass.getMethod("set" + name.substring(0, 1).toUpperCase() + name.substring(1), destDescriptor.getPropertyType());
  
                          destDescriptor.setWriteMethod(writeMethod);
                      } catch (Exception e) {
                      }
                  }
                  if (writeMethod != null) {
                      //类型匹配
                      boolean matched = propertyType == srcDescriptor.getPropertyType();
                      if (!matched) {
                      	
                          if (value != null || setDefaultValForNull) {
                          	if(isSimpleDataType(srcDescriptor)){                        		
                          		value = toValue(srcDescriptor, value, propertyType);
                          	}else{
                          		value = copy(value, propertyType);
                          	}
                          }
                      }
                      //设置默认值
                      if (value == null && setDefaultValForNull) {
                          if (destDescriptor.getPropertyType() == Long.class || destDescriptor.getPropertyType() == Integer.class || destDescriptor.getPropertyType() == Short.class || destDescriptor.getPropertyType() == Double.class || destDescriptor.getPropertyType() == Float.class) {
                              value = 0;
                          } else if (destDescriptor.getPropertyType() == String.class) {
                              value = "";
                          } else if (destDescriptor.getPropertyType() == BigDecimal.class) {
                              value = new BigDecimal("0");
                          }
                      }
  
                      if (value != null) {
                          writeMethod.invoke(dest, value);
                      }
                  }
              }
  
              return dest;
          } catch (Exception e) {
              throw new BeanConverterException(e);
          }
      }