package cn.zybgs.biangong.base.boot.utils; import org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 实体对比工具类 * * @author handafeng 2023/06/19 9:52 */ public class BeanCompareUtil { /** * 比较两个实体,把所有有差异的属性组合为一个实体返回 * * @param original * @param modified * @param <T> * @return */ public static <T> T compareEntities(T original, T modified) { // 获取实体类的 Class 对象 Class<?> entityClass = original.getClass(); // 创建差异实体对象 T diffEntity; try { diffEntity = (T) entityClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); return null; } // 获取实体类的所有属性 java.lang.reflect.Field[] fields = entityClass.getDeclaredFields(); // 存储差异属性的列表 List<String> diffProperties = new ArrayList<>(); // 遍历属性并比较值 for (java.lang.reflect.Field field : fields) { field.setAccessible(true); try { // 比较属性值 Object originalValue = field.get(original); Object modifiedValue = field.get(modified); if ((originalValue == null && modifiedValue != null) || (originalValue != null && !originalValue.equals(modifiedValue))) { // 属性值不同,将属性名添加到差异属性列表 diffProperties.add(field.getName()); } } catch (IllegalAccessException e) { e.printStackTrace(); } } // 将差异属性设置到差异实体对象中 for (String property : diffProperties) { try { java.lang.reflect.Field field = entityClass.getDeclaredField(property); field.setAccessible(true); Object modifiedValue = field.get(modified); field.set(diffEntity, modifiedValue); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } return diffEntity; } /** * 比较两个实体,把所有有差异的属性组合为一个实体返回,并且可以指定保留某个属性 * * @param original * @param modified * @param retainedProperty 保留字段(用于更新) * @param <T> * @return */ public static <T> T compareEntities(T original, T modified, String retainedProperty) { //若保留字段为空,则返回差异 if (StringUtils.isBlank(retainedProperty)) { return compareEntities(original, modified); } // 获取实体类的 Class 对象 Class<?> entityClass = original.getClass(); // 创建差异实体对象 T diffEntity; try { diffEntity = (T) entityClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); return null; } // 获取实体类的所有属性 Field[] fields = entityClass.getDeclaredFields(); // 遍历属性并比较值 for (Field field : fields) { field.setAccessible(true); try { // 比较属性值 Object originalValue = field.get(original); Object modifiedValue = field.get(modified); // 属性名与指定的保留属性相同,则保留, if (field.getName().equals(retainedProperty)) { field.set(diffEntity, modifiedValue); } if ((originalValue == null && modifiedValue != null) || (originalValue != null && !originalValue.equals(modifiedValue))) { if (!field.getName().equals(retainedProperty)) { field.set(diffEntity, modifiedValue); } else { field.set(diffEntity, originalValue); } } } catch (IllegalAccessException e) { e.printStackTrace(); } } return diffEntity; } /** * 比较两个实体,把所有有差异的属性组合为一个实体返回,并且可以指定保留某些属性 * * @param original * @param modified * @param reserveFields 保留字段s(用于更新) * @param <T> * @return */ public static <T> T compareEntities(T original, T modified, String... reserveFields) { //若保留字段为空,则返回差异 if (reserveFields == null || reserveFields.length == 0) { return compareEntities(original, modified); } List<String> reserveFieldList = Arrays.asList(reserveFields); // 获取实体类的 Class 对象 Class<?> entityClass = original.getClass(); // 创建差异实体对象 T diffEntity; try { diffEntity = (T) entityClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); return null; } // 获取实体类的所有属性 Field[] fields = entityClass.getDeclaredFields(); // 遍历属性并比较值 for (Field field : fields) { field.setAccessible(true); try { // 比较属性值 Object originalValue = field.get(original); Object modifiedValue = field.get(modified); // 属性名与指定的保留属性相同,则保留, if (reserveFieldList.contains(field.getName())) { field.set(diffEntity, modifiedValue); } if ((originalValue == null && modifiedValue != null) || (originalValue != null && !originalValue.equals(modifiedValue))) { field.set(diffEntity, modifiedValue); } } catch (IllegalAccessException e) { e.printStackTrace(); } } return diffEntity; } }