code: @SuppressWarnings({ "unchecked" })
      public static <T> T copy(final Class<? extends T> targetClass, final Object entity, final Collection<String> selectPropNames) {
          final Class<?> srcCls = entity.getClass();
          T copy = null;
  
          if (selectPropNames == null && Utils.kryoParser != null && targetClass.equals(srcCls) && !notKryoCompatible.contains(srcCls)) {
              try {
                  copy = (T) Utils.kryoParser.copy(entity);
              } catch (Exception e) {
                  notKryoCompatible.add(srcCls);
  
                  // ignore
              }
          }
  
          if (copy != null) {
              return copy;
          }
  
          copy = N.newInstance(targetClass);
  
          merge(entity, copy, selectPropNames);
  
          setDirtyMarker(entity, copy);
  
          return copy;
      }
docs: Returns a new created instance of the specified {@code cls} and set with
  same properties retrieved by 'getXXX' method in the specified
  {@code entity}.
  
  @param targetClass
  a Java Object what allows access to properties using getter
  and setter methods.
  @param entity
  a Java Object what allows access to properties using getter
  and setter methods.
  @param selectPropNames
  @return