这两天有个需求需要对两个对象的内容进行比较,不同的数据进行记录。思考再三,我觉得使用反射机制进行处理更加方便。
这里封装了两个方法。
1.一个是参考网上的信息,获取类中属性的值
public static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
}
2.另一个是对两个对象进行验证,并保存修改信息
public static List CompareCzjl(Object old_entity, Object new_entity, User user) {
//返回类
Class> new_czjl = new_entity.getClass();
Class> old_czjl = old_entity.getClass();
//初始化list和操作记录对象
List czjlList = new ArrayList<>();
Czjl_entity czjl_entity= null;
try {
//获取所有私有属性
Field[] new_field = new_czjl.getDeclaredFields();
//遍历
for (Field field : new_field) {
//允许修改
field.setAccessible(true);
//获取旧对象的对应属性
Field old_field = old_czjl.getDeclaredField(field.getName());
old_field.setAccessible(true);
//当新对象属性为private且新对象属性值不为空且旧对象属性不为空且两个对象属性值不相等时
if (field.getModifiers() == 2 && field.get(new_entity) != null && old_field.get(old_entity) != null && !field.get(new_entity).toString().equals(old_field.get(old_entity).toString())) {
//对不一致的属性进行处理
//新增操作记录
czjl_entity = new Czjl_entity ();
czjl_entity.setId(UUID.randomUUID());
//登录人信息
czjl_entity.setUserId(user.getId());
czjl_entity.setUsername(user.getXm());
//对象id
czjl_entity.setEntitiyId(getFieldValueByName("id",new_entity).toString());
//对象简称
czjl_entity.setEntitySimName(new_entity.getClass().getSimpleName());
//对象全称
czjl_entity.setEntityName(new_entity.getClass().getName());
//字段名
czjl_entity.setEntity(field.getName());
//属性值,原字段内容,现字段内容
czjl_entity.setOldTableContent(old_field.get(old_entity).toString());
czjl_entity.setNewTableContent(field.get(new_entity).toString());
//修改时间
czjl_entity.setEditTime(new Date());
czjlList.add(czjl_entity);
}
}
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
return czjlList;
}
这里用了Field类中的getModifiers方法,该方法会返回当前属性的修饰符int类型值。如private修饰符返回2,我这里做了限制,只对修饰符为private的属性进行操作。



