比较两个对象是否相同,输出不同的属性值(二)

上一篇返回的是属性,但是不是汉字看的不清楚,这篇让我们来通过自定义注解,通过获取注解的值来将将属性转换为汉字,方便阅读。
对象:

@Data
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @FieldName("等级")
    private int level;
    @FieldName("名称")
    private String name;
}

自定义注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FieldName {
    String value();
}

对比:

User user1 = new User(1,"wzx");
        User user2 = new User(2,"wjg");
        String oldContent = "旧内容:";
        String newContent = "新内容:";
        Field[] fields1 = user1.getClass().getDeclaredFields();
        Field[] fields2 = user2.getClass().getDeclaredFields();
        for (int i = 0; i <fields1.length ; i++) {
            fields1[i].setAccessible(true);
            fields2[i].setAccessible(true);
            if(!fields1[i].get(user1).equals(fields2[i].get(user2))){
            	//fields1[i].getDeclaredAnnotation(FieldName.class).value()
                //获取该属性上的注解value的值
                oldContent+=(fields1[i].getDeclaredAnnotation(FieldName.class).value()+":"+fields2[i].get(user1)+";");
                newContent+=(fields2[i].getDeclaredAnnotation(FieldName.class).value()+":"+fields2[i].get(user2)+";");
            }
        }
        System.out.println(oldContent);
        System.out.println(newContent);

输出:

旧内容:等级:1;名称:wzx;
新内容:等级:2;名称:wjg;

这样就将level换为了我们在level属性上添加的注解值:等级,name同样换为了名称。