1.首先定义一个注解,此注解的作用是说明属性的意义
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
String value() default "";
}
2.编写对象对比方法
public static String compare(Object obj1,Object obj2,Class clz) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
StringBuilder sb = new StringBuilder();
Field[] fields = clz.getDeclaredFields();
for(Field field:fields){
boolean isHas = field.isAnnotationPresent(Info.class);
if(isHas){
Info fieldAnno = field.getAnnotation(Info.class);
String infoName = fieldAnno.value();
String fieldName = field.getName();
Method me = clz.getDeclaredMethod("get"+fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
String value1 = String.valueOf(me.invoke(obj1)) ;
String value2 = String.valueOf(me.invoke(obj2)) ;
if(!value1.equals(value2)){
sb.append(infoName+"由"+value1+"变为"+value2+";\n");
}
}
}
return sb.toString();
}
3.定义测试对象类
@Data
@ToString
public class User implements Serializable{
private static final long serialVersionUID = 1L;
@Info("标识")
private Long id;
@Info(value="姓名")
private String name;
@Info(value="年龄")
private Short age;
}
4.测试方法
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
User u1 = new User();
User u2 = new User();
u1.setId(1L);
u2.setId(1L);
u1.setName("张三");
u2.setName("李四");
System.out.println(compare(u1,u2,User.class));
}
结果为
姓名由张三变为李四;