一、需求:
编辑时,需要判断每一个字段是否有变化并记录。
如果有变化,需要记录变化的字段信息:包括字段中文名称、字段的英文key、字段变更前的值、字段变更后的值。
ps:字段有可能是枚举,即数据库存储的是英文code,前端显示的是code对应中文(一般枚举这种,接口交互使用英文code,数据库存储也是英文code)。此时变更前、后的值,需要把英文code和中文名称全部记录下来。
即最终要记录的,是:字段的英文key、字段中文名称、字段变更前的数据库值、字段变更前的中文显示值、字段变更后的数据库值、字段变更后的中文显示值。
二、只使用反射的不足:
纯粹使用反射,只能拿到:字段的英文key、字段变更前的数据库值、字段变更后的数据库值。
缺失:字段中文名称、字段变更前的中文显示值、、字段变更后的中文显示值。
三、自定义注解+反射:
3-1、自定义注解:
在要比较的对象的属性上,添加自定义注解,注解可以标注每一个属性的对应中文名称、相应枚举情况
import java.lang.annotation.*;
/**
* 自定义注解
* 使用在属性上
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AttributeDesc {
//属性名称
String notes() default "";
//属性是否属于枚举类型,""不是,如果不为"",比如是"card-type",那说明,此是枚举类,并且对应的枚举的关键字是"card-type",只要从数据字典内,类型是"card-type"的一批数据里去匹配就好
String enumCode() default "";
}
3-2、实体类内使用:
字段的英文key为"stockholderCardType"的中文解释是"股东证件类型",是枚举,枚举对应的数据字典类型是"card-type",由"@AttributeDesc(notes = "股东证件类型", e