POM:
<dependency> <groupId>net.sf.dozer</groupId> <artifactId>dozer</artifactId> <version>5.5.1</version> </dependency>
JAVA:
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.dozer.DozerBeanMapper; import com.nike.gcsc.annotation.FieldName; /** * dozer util class * Notice: if you wan't use this util,please import dozer artifact in you pom * @author roger yang * @date 6/13/2019 */ public final class BeanMapper { private static final Set<String> IGNORE_FILEDS = new HashSet<>(1); static { IGNORE_FILEDS.add("serialVersionUID"); } private BeanMapper() {} private static DozerBeanMapper dozer = new DozerBeanMapper(); public static <T> T map(Object source, Class<T> destinationClass) { if (source == null) { return null; } return dozer.map(source, destinationClass); } public static <T> List<T> mapList(Collection<?> sourceList, Class<T> destinationClass) { if (sourceList == null) { return Collections.emptyList(); } List<T> destinationList = new ArrayList<>(); for (Object sourceObject : sourceList) { T destinationObject = dozer.map(sourceObject, destinationClass); destinationList.add(destinationObject); } return destinationList; } public static void copy(Object source, Object destinationObject) { if (source == null || destinationObject == null) { return; } dozer.map(source, destinationObject); } public static Map<String, Object> bean2Map(Object source) { Map<String, Object> result = new HashMap<>(); try { Class<?> sourceClass = source.getClass(); Field[] sourceFiled = sourceClass.getDeclaredFields(); for (Field field : sourceFiled) { field.setAccessible(true); FieldName fieldName = field.getAnnotation(FieldName.class); if (fieldName == null) { result.put(field.getName(), field.get(source)); } else { if (fieldName.Ignore()) continue; result.put(fieldName.value(), field.get(source)); } } return result; } catch (IllegalAccessException e) { throw new RuntimeException(e); } } public static <T> T map2Bean(Map<String, Object> source, Class<T> instance) { try { T object = instance.newInstance(); Field[] fields = object.getClass().getDeclaredFields(); Method[] methods = object.getClass().getMethods(); for (Field field : fields) { Method method = getSetMethodName(field, methods); if(null == method) { throw new RuntimeException("Filed:" + field.getName() + " no set method"); } method.invoke(object, source.get(field.getName())); } return object; } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new RuntimeException(e); } } /** * get field set method * @param field * @param methods * @return */ private static Method getSetMethodName(Field field, Method[] methods) { String fieldName = field.getName(); String methodName = "set".concat(fieldName.substring(0, 1).toUpperCase()).concat(fieldName.substring(1)); Method method = filterMethod(methods, methodName); return method; } /** * @param methods * @param methodName * @return */ private static Method filterMethod(Method[] methods, String methodName) { if(methods!=null && methods.length>0) { for(Method method : methods) { if(method.getName().equals(methodName)) { return method; } } } return null; } }
其中反射的那块可以把Method和Field进行缓存,不用每次都去反射获取,可以参考:https://www.cnblogs.com/yangzhilong/p/8085019.html
来源:https://www.cnblogs.com/yangzhilong/p/11534527.html