public void saveChangeVolue(Object before, Object after,String log) {
StringBuffer alterContent=new StringBuffer();
//before和after都不为空时 --属性变化
try {
if (before != null && after != null) {
//获取class字节码
Class<?> classBefor = before.getClass();
Class<?> classAfter = after.getClass();
//获取所有属性
Field[] fsBefor = classBefor.getDeclaredFields();
Field[] fsAfter = classAfter.getDeclaredFields();
//获取类名
String typeName = getClassName(after.getClass().getName());
for (Field bField : fsBefor) {
//设置对象中成员 属性private为可读
bField.setAccessible(true);
for (Field aField : fsAfter) {
aField.setAccessible(true);
Id id = aField.getAnnotation(Id.class);
//临时解决。后期再改。。
if(StringUtils.equals(bField.getName(),"serialVersionUID")){
continue;
}
PropertyDescriptor bpd = new PropertyDescriptor(bField.getName(), classBefor);
if (StringUtils.equals(bField.getName(), aField.getName()) && id == null) {
// 获得属性值
Method bmethod = bpd.getReadMethod();
//构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中
PropertyDescriptor apd = new PropertyDescriptor(aField.getName(), classAfter);
//从属性描述器中获取 get 方法
Method amethod = apd.getReadMethod();
// 获得属性类型
if (bField.getGenericType().toString().equals("class java.lang.String")
&& aField.getGenericType().toString().equals("class java.lang.String")) {
// 比较对象前后的属性值时候不相同
if (!StringUtils.equals(((String) bmethod.invoke(before)),
((String) amethod.invoke(after)))) {
DataChangeRecord dto = new DataChangeRecord();
// 判断转换前后值都为null或空时,不需要记录变更数据
if(StringUtils.isNotBlank((String) bmethod.invoke(before))||StringUtils.isNotBlank((String) amethod.invoke(after))){
//记录到需要保存的表中,如记录表
aField.getName()//字段名
//修改的字段
if (StringUtil.isNotEmpty(converMap.get(aField.getName()))) {
alterContent.append("编辑"+converMap.get(aField.getName())+','+(String) bmethod.invoke(before)+"为"+(String) amethod.invoke(after));
}
behaviorDto.setBehavDesc(alterContent.toString());
//dto.setOperateType(operateStatus);
dto.setDataId(behaviorDto.getDataId());
dto.setParentDataId(behaviorDto.getFileEntityId());
dto.setChangeType("1");
dataChangeRecords.add(dto);
}
}
}else if(bField.getGenericType().toString().equals("class java.math.BigDecimal")){
if (!StringUtils.equals(String.valueOf(bmethod.invoke(before)),
String.valueOf(amethod.invoke(after)))) {
// 判断转换前后值都为null或空时,不需要记录变更数据
if(bmethod.invoke(before)!=null||amethod.invoke(after)!=null){
/ /实体
if(bmethod.invoke(before)!=null){
dto.setBeforeUpdateValue(((BigDecimal)bmethod.invoke(before)).toPlainString());
alterContent.append("编辑"+converMap.get(aField.getName())+','+((BigDecimal)bmethod.invoke(before)).toPlainString());
}
if (bmethod.invoke(before)!=null && amethod.invoke(after)!=null) {
alterContent.append("为"+((BigDecimal)amethod.invoke(after)).toPlainString());
}
//保存数据到数据库
//TODO
}
}
} else {
if (!StringUtils.equals(String.valueOf(bmethod.invoke(before)),
String.valueOf(amethod.invoke(after)))) {
// 判断转换前后值都为null或空时,不需要记录变更数据
if(bmethod.invoke(before)!=null||amethod.invoke(after)!=null){
DataChangeRecord dto = new DataChangeRecord();
if(bmethod.invoke(before)!=null){
dto.setBeforeUpdateValue(String.valueOf(bmethod.invoke(before)));
//修改的字段
alterContent.append("编辑"+converMap.get(aField.getName())+','+String.valueOf(bmethod.invoke(before)));
}
if (bmethod.invoke(before)!=null && amethod.invoke(after)!=null) {
alterContent.append("为"+String.valueOf(amethod.invoke(after)));
}
//保存数据到数据库
//TODO
}
}
}
}
}
}
//before为null,after不为null --新增
} else if (after != null && before == null) {
Class<?> classAfter = after.getClass();
Field[] fsAfter = classAfter.getDeclaredFields();
String typeName = getClassName(after.getClass().getName());
for (Field aField : fsAfter) {
aField.setAccessible(true);
Id id = aField.getAnnotation(Id.class);
PropertyDescriptor apd = new PropertyDescriptor(aField.getName(), classAfter);
Method amethod = apd.getReadMethod();
if (aField.getGenericType().toString().equals("class java.lang.String") && id == null) {
// 判断转换前后值都为null或空时,不需要记录变更数据
if(StringUtils.isNotBlank((String) amethod.invoke(after))){
DataChangeRecord dto = new DataChangeRecord();
// 是否是字典属性,是:保存字典对应的名称
dto.setAfterUpdateValue((String) amethod.invoke(after));
dto.setTableName(typeName);
dto.setColumnName(aField.getName());
//dto.setOperateType(operateStatus);
dto.setDataId(behaviorDto.getDataId());
dto.setParentDataId(behaviorDto.getFileEntityId());
dto.setChangeType("2");
dataChangeRecords.add(dto);
}
}else if(aField.getGenericType().toString().equals("class java.math.BigDecimal") && id == null){
// 判断转换前后值都为null或空时,不需要记录变更数据
if(amethod.invoke(after)!=null){
//保存数据到数据库
//TODO
}
} else if (id == null) {
// 判断转换前后值都为null或空时,不需要记录变更数据
if(StringUtils.isNotBlank(String.valueOf(amethod.invoke(after)))){
//保存数据到数据库
//TODO
}
}
}
//before不为null,after为null --删除
} else if (after == null && before != null) {
Class<?> classBefore = before.getClass();
Field[] fsBefore = classBefore.getDeclaredFields();
String typeName = getClassName(before.getClass().getName());
for (Field bField : fsBefore) {
bField.setAccessible(true);
Id id = bField.getAnnotation(Id.class);
PropertyDescriptor bpd = new PropertyDescriptor(bField.getName(), classBefore);
Method bmethod = bpd.getReadMethod();
if (bField.getGenericType().toString().equals("class java.lang.String") && id == null) {
if(StringUtils.isNotBlank((String) bmethod.invoke(before))){
//保存数据到数据库
//TODO
}
}else if(bField.getGenericType().toString().equals("class java.math.BigDecimal") && id == null){
// 判断转换前后值都为null或空时,不需要记录变更数据
if(bmethod.invoke(before)!=null){
//保存数据到数据库
//TODO
}
} else if (id == null) {
// 判断转换前后值都为null或空时,不需要记录变更数据
if(StringUtils.isNotBlank(String.valueOf(bmethod.invoke(before)))){
//保存数据到数据库
//TODO
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
/**
* 插入数据库操作
*/
if(dataChangeRecords.size()>0){
Field afterField=null;
Field beforeField=null;
try{
afterField = after.getClass().getDeclaredField("objectid");
afterField.setAccessible(true);
beforeField=before.getClass().getDeclaredField("objectid");
beforeField.setAccessible(true);
if(StringUtils.equals(afterField.get(after).toString(), beforeField.get(before).toString())){
insertBehavior(behaviorDto,userInfo);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
java通过类的反射获取页面修改字段前后值以及字段名称
最新推荐文章于 2023-11-24 10:57:31 发布