开发需求中会存在比较前端传来的数据与后台数据有哪些数据发生了改变,一个一个字段比较太麻烦了,通过以下方法可以便捷的比较出来
java
//实现方法
private static List<ChangeContentDTO> getDifferentField(Object obj, Object afterObj) {
try {
//首先,创建一个空的列表用于存储变化的内容。
List<ChangeContentDTO> changeContentDTOList = new ArrayList<>();
//检查传入的两个对象是否为空,如果任何一个对象为空,则直接返回空列表。
if (Objects.isNull(obj) || Objects.isNull(afterObj)) {
return changeContentDTOList ;
}
// 获取对象的 Class 对象,然后获取这个 Class 对象的所有字段。
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 遍历这些字段,对于每一个字段,首先设置它可以被访问(因为默认情况下,Java 的私有字段是不能被直接访问的)。
field.setAccessible(true);
if (Objects.isNull(field.get(obj))) {
continue;
}
DefinedAnnotation annotation= field.getDeclaredAnnotation(DefinedAnnotation.class);
//检查字段的值是否为空,如果为空,则跳过这个字段。
if (Objects.nonNull(annotation)&&!Objects.equals(field.get(obj), field.get(afterObj))) {
//获取字段的注解,如果字段有定义的注解,并且字段的值在两个对象中不同,则创建一个 DTO 对象,将字段的名称、注解的名称、变化前的值和变化后的值存入 DTO 对象,然后将这个 DTO 对象添加到列表中。
ChangeContentDTO dto = ChangeContentDTO.builder()
.fieldCode(field.getName())
.fieldName(annotation.name())
.changeBefore(field.get(obj))
.changeAfter(field.get(afterObj)).build();
changeContentDTOList.add(dto);
}
}
return changeContentDTOList;
} catch (IllegalAccessException e) {
throw new BusinessException(BasicErrorCode.BIZ_ERROR, "通过反射获取对象字段的值失败");
}
}
java
//创建bean对象存储变化的数据
@ApiModel("变更内容DTO")
@Getter
@Setter
@Builder
public class ChangeContentDTO {
@ApiModelProperty("字段名称")
private String fieldCode;
@ApiModelProperty("字段名称")
private String fieldName;
@ApiModelProperty("变更前的内容")
private Object changeBefore;
@ApiModelProperty("变更后的内容")
private Object changeAfter;
}
java
//main方法测试
public static void main(String[] args) {
ResourceEntity resourceEntity = new ResourceEntity();
ResourceEntity resourceEntity1 = new ResourceEntity();
resourceEntity.setCode("111");
resourceEntity1.setCode("222");
resourceEntity.setName("name");
resourceEntity1.seName("name");
List<ChangeContentDTO> list = getDifferentField(resourceEntity, resourceEntity1);
System.out.println(list);
}