利用反射获取类属性值,并依次判断属性值是否相同,不同返回true,代表已经发生变化
可以改变一下返回值,显示那个属性字段发生改变
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private long id;
private int age;
private BigDecimal sal;
private String name;
}
/**
* 方法调用
* @param args
*/
public static void main(String[] args) {
Teacher teacher = Teacher.builder().id(123L).age(25).sal(new BigDecimal(123)).name("老师").build();
Teacher teacher1 = Teacher.builder().id(1L).age(25).sal(new BigDecimal(123)).name("老师1").build();
System.out.println("教师信息-1:"+"\n"+teacher);
System.out.println("教师信息-2:"+"\n"+teacher1);
//id不需要比对
System.out.println(checkData(teacher,teacher1, Arrays.asList("id")) ? "数据变化" :"数据未变化");
}
比对方法
/**
* 判断属性值是否发生变化
* @param class1 新数据
* @param class2 历史数据
* @param filterFields 不需要比对的字段
* @return boolean 有变化返回true
*/
private static <T> Boolean checkData(T class1, T class2, List<String> filterFields) {
//判断是否为同类
if(class1.getClass() != class2.getClass()){
throw new ClassCastException("数据类型不一致");
}
//获取所有类字段
Field[] fields = ReflectUtil.getFields(class1.getClass());
//过滤不需要比对的字段
List<Field> fieldList = Arrays.stream(fields).filter(f->!filterFields.contains(f.getName())).collect(Collectors.toList());
for (Field field : fieldList) {
field.setAccessible(true);
try {
//获取属性值
Object value1 = field.get(class1);
Object value2 = field.get(class2);
//class1属性值不为空,class2属性值为空
if (ObjectUtil.isNotEmpty(value1) && ObjectUtil.isEmpty(value2)){
return true;
}
//class1属性值为空,class2属性值不为空
if (ObjectUtil.isEmpty(value1) && ObjectUtil.isNotEmpty(value2)){
return true;
}
//值不为空,属性值不等
if (ObjectUtil.isNotEmpty(value1) && ObjectUtil.isNotEmpty(value2)){
//对比属性值是否相同
if(!CompareValueEnum.FiledType(value1,value2)){
return true;
}
}
} catch (Exception e) {
}
}
return false;
}
枚举类依据类型判断属性是否相同,相同返回true
/**
* 比较属性值是否相同
*
* @author shuai
* @since 2022
* @return Boolean 相同:true 不同:false
*/
public enum CompareValueEnum {
Long(){
@Override
public Boolean compareValue( Object var1, Object var2) {
Long v1 = (Long) var1;
Long v2 = (Long) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
},
Boolean(){
@Override
public Boolean compareValue( Object var1, Object var2) {
Boolean v1 = (Boolean) var1;
Boolean v2 = (Boolean) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
},
Integer(){
@Override
public Boolean compareValue(Object var1, Object var2) {
Integer v1 = (Integer) var1;
Integer v2 = (Integer) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
},
BigDecimal(){
@Override
public Boolean compareValue(Object var1, Object var2) {
BigDecimal v1 = (BigDecimal) var1;
BigDecimal v2 = (BigDecimal) var2;
if(v1.compareTo(v2) == 0){
return true;
}
return false;
}
},
String(){
@Override
public Boolean compareValue(Object var1, Object var2) {
String v1 = (String) var1;
String v2 = (String) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
};
public abstract Boolean compareValue(Object var1, Object var2);
/**
* 对比属性值是否相同
* @param var1 属性值1
* @param var2 属性值2
* @return Boolean 相同:true 不同:false
*/
public static Boolean FiledType(Object var1, Object var2){
//获取字段类型
String type = var1.getClass().getSimpleName();
for (CompareValueEnum code : CompareValueEnum.values()){
if (type.equalsIgnoreCase(code.name())){
if(!code.compareValue(var1,var2)){
return false;
}
break;
}
}
return null;
}
}
运行结果
教师信息-1:
Teacher(id=123, age=25, sal=123, name=老师)
教师信息-2:
Teacher(id=1, age=25, sal=123, name=老师1)
数据变化
id字段不在比对字段中,已过滤
教师信息-1:
Teacher(id=123, age=25, sal=123, name=老师)
教师信息-2:
Teacher(id=1, age=25, sal=123, name=老师)
数据未变化