public List<SrSupChangeRemark> getBasciInformation(SrSupplierChangePage srSupplierChangePage,List<SrSupChangeRemark> differencesList) {
String supplierId = srSupplierChangePage.getSupplierId();
SrSupplier srSupplier = srSupplierService.getById(supplierId);
Field[] fields = SrSupplierChangePage.class.getDeclaredFields();
Field[] fields1 = SrSupplier.class.getDeclaredFields();
//单独做了一张维表sr_sup_change_comparative_reference取中英文对照,放到循环外
List<SrSupChangeComparativeReference> references = srSupplierService.getName();
Map<String,String> referenceMap = new HashMap<>();
for (SrSupChangeComparativeReference reference:references){
referenceMap.put(reference.getEnglishName(), reference.getChineseName());
}
for (Field field : fields) {
for (Field field1 : fields1) {
if (field.getName().equals(field1.getName())) {
field.setAccessible(true); // 设置字段可访问,即使是私有字段
field1.setAccessible(true);
try {
//对比两个类的字段是否相同,不只判断名称
Field correspondingField = getFieldByName(srSupplier.getClass(), field.getName());
if (correspondingField != null) {
Object value1 = field.get(srSupplierChangePage);
Object value2 = field1.get(srSupplier);
if(value2 instanceof BigDecimal){
BigDecimal valueBigDecimal = (BigDecimal) value2;
value2 = valueBigDecimal.stripTrailingZeros().toPlainString();//toPlainString取消科学计数法,stripTrailingZeros去0
}
// 比较字段值是否相同
if (value1 != null&& !value1.toString().equals(value2==null?"":value2.toString())) {
SrSupChangeRemark changeRemark = new SrSupChangeRemark();
changeRemark.setChangeContent(referenceMap.get(field.getName()));
changeRemark.setId(supplierId);
changeRemark.setAfterChange(String.valueOf(value1==null?"":value1.toString()));
changeRemark.setBeforeChange(String.valueOf(value2==null?"":value2.toString()));
differencesList.add(changeRemark);
}
}
} catch (IllegalAccessException e) {
// 处理异常,例如记录日志
e.printStackTrace();
}
}
}
}
return differencesList;
}
以上述代码为例,步骤如下:
1.通过getDeclaredFields方法获取类中的变量名,变量类型
2.这个案例中主要是对两个实体中的变量个数以及变量名进行对比,将其中不同的放到differencesList中
3.这个案例中在setChangeContent的时候由于需要取中文名,而反射后的字段是定义在实体中的声明变量,都是英文。所以做了一张维表进行中英对照。而为了提升效率把对于表的查询操作放到了for循环外,然后放到Map中再进行get,减少表的操作。