比较两个对象是否相同,输出不同的属性值(二)
上一篇返回的是属性,但是不是汉字看的不清楚,这篇让我们来通过自定义注解,通过获取注解的值来将将属性转换为汉字,方便阅读。
对象:
@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同样换为了名称。