Java对比两个对象的不同
JDK版本:1.8 (由于用到了lambda、stream)
Maven
<!-- 用到了hutool的一些工具类方法 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.11</version>
</dependency>
<!-- lombok简化对象封装 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
假设我们现在有个需求,信息变更审核功能,要求要记录信息变更 修改前 和 修改后 的值。
eg: 姓名:由 张三 变更为 李四
核心注解:
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ColumnName {
/**
* 字段名称
* @return
*/
String value() default "";
/**
* 当前字段的类型,如果是集合指定集合中的类型
* 基本类型 可不指定
* 用于复杂类型 eg: Object | List<Object>
* @return
*/
Class<?> classType() default void.class;
/**
* 是否是集合类型
* 如果是集合类型必须指定其
* 1. 集合中存放的对象类型 {@link ColumnName#classType()}
* 2. 集合中的对象的唯一标识 {@link ColumnName#onlyMark()}
* @return
*/
boolean isList() default false;
/**
* 如果是集合类型还要知道该集合对象中什么字段可以确定唯一 可多个 逗号隔开 eg: id,name
* @return
*/
String onlyMark() default "";
/**
* 如果是日期类型 可自定义日期格式
* 默认 yyyy-MM-dd HH:mm:ss
* 常用格式,包括:
* HH:mm:ss
* yyyy-MM-dd
* yyyy-MM-dd HH:mm
* yyyy-MM-dd HH:mm:ss
* yyyy-MM-dd HH:mm:ss.SSS
* @return
*/
String dateFormat() default "yyyy-MM-dd HH:mm:ss";
}
有了以上注解后我们来看我们要对比的实体类
假设我们现在有一个人的类
里面包含 编号、姓名、年龄、生日,以及这个人养的一条狗,以及一个女朋友的List集合
人类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@ColumnName("编号")
private Integer id;
@ColumnName("姓名")
private String name;
@ColumnName("年龄")
private Integer age;
@ColumnName(value = "生日", dateFormat = "yyyy-MM-dd")
private Date birthDay;
@ColumnName(value = "狗", classType = Dog.class)
private Dog dog;
@ColumnName(value = "女朋友", isList= true, classType = GirlFriend.class, onlyMark = "id,age")
private List<GirlFriend> girlFriends;
}
狗类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
@ColumnName("狗名字")
private String name;
}
女朋友类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GirlFriend {
@ColumnName("编号")
private Integer id;
@ColumnName("姓名")
private String name;
@ColumnName("年龄")
private Integer age;
}
创建一个存放不同的类,又来存放最终对比出来的不同的结果
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Different {
// 字段
private String field;
// 对应的字段提示 eg: 姓名
private String fieldName;
// 变更前的值
private String oldData;
// 变更后的值
private String newData;
@Override
public String toString() {
return "数据库字段:'" + field + "', 字段:'" + fieldName + '\'' + ", 老值:'" + oldData + '\'' + ", 新值:'" + newData + '\'';
}
}
现在我们有一个修改之前的人对象和修改之后的人对象
要求:获取到两者的不同之处
public static void main(String[] args) throws Exception {
// 修改之前的对象
Person person1 = new Person(