java 记录修改日志

需求:记录哪些记录进行了修改,要记录修改前后的数据。

原理:利用java反射

实现:

1、要记录日志的对象,添加注解

public class LegalUnit implements Serializable{
    
private static final long serialVersionUID = 1L;


private Long iD;
    
@XmlElement(name = "名称")
public String name;
    
@XmlElement(name = "责任单位")
public String departmentID;
    
@XmlElement(name = "所在城市")
public Integer province;
    
private String provinceName;
    
@XmlElement(name = "所在区县")
public Integer city;
    
private String cityName;
    
@XmlElement(name = "注册地址")
public String regAddress;
    
@XmlElement(name = "经营范围")
public String manageRange;
    
@XmlElement(name = "注册资本(万元)")
public BigDecimal regFund;
    
@XmlElement(name = "设立日期")
    @JSONField(format="yyyy-MM-dd")
public Date setUpDate;
    
@XmlElement(name = "经营期限开始")
    @JSONField(format="yyyy-MM-dd")
public Date manageBeginDate;
    
       @XmlElement(name = "经营期限结束")
        @JSONField(format="yyyy-MM-dd")
public Date manageEndDate;
 }

2、工具类 UpdateLogUtil.Class

package com.newsee.util;


import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import javax.xml.bind.annotation.XmlElement;


public class UpdateLogUtil {
public static String UpdateLog(Object obj_old,Object obj_new) throws Exception {
        Class clas_old = obj_old.getClass();
        Class clas_new = obj_new.getClass();
        if(!(clas_old.isInstance(obj_new))){
        System.out.println("UpdateLogUtil.UpdateLog:传入的两个java对象类型不一致!");
        return "UpdateLogUtil.UpdateLog:传入的两个java对象类型不一致!";
        }
        Field[] fields = clas_old.getFields();  
        String remark = "";
        for (Field field : fields) {
        String name = field.getName();
        String type = field.getType().getName();
        field.setAccessible(true); //设置些属性是可以访问的 
        Object val_old = field.get(obj_old);//得到此属性的修改前值  

        Object val_new = field.get(obj_new);//得到此属性的修改后值

                 //bigdecimal 类型的数据要去掉小数点后尾部的0不一致造成数据比对差异
        if(type.equals("java.math.BigDecimal") && val_old!=null && val_new!=null ){
            BigDecimal val_old_big = new BigDecimal(String.valueOf(val_old)); 
            BigDecimal  val_new_big = new BigDecimal(String.valueOf(val_new)); 
            if(String.valueOf(val_old_big).indexOf(".")!= -1 || String.valueOf(val_new_big).indexOf(".")!= -1 ){//由于无法获取精度值,只能对所有带小数点的数据进行处理
                DecimalFormat formatter1=new DecimalFormat("0.000000");  
                val_old = formatter1.format(val_old_big);
                val_new = formatter1.format(val_new_big);
            }
        }
        if(!String.valueOf(val_old).equals(String.valueOf(val_new))){
        //保存处理数据 
        System.out.println("UpdateLogUtil.UpdateLog:"+name+"--"+val_old+"----"+val_new);
        //1、获取属性上的指定类型的注解    
        Annotation annotation = field.getAnnotation(XmlElement.class);
        //有该类型的注解存在    
        if (annotation!=null) {    
        //强制转化为相应的注解        
        XmlElement xmlElement = (XmlElement)annotation;    
        //3、获取属性上的指定类型的注解的指定方法    
        if (xmlElement.name().equals("##default")) {    
        System.out.println("UpdateLogUtil.UpdateLog:属性【"+name+"】注解使用的name是默认值: "+xmlElement.name()); 
        remark += xmlElement.name()+"修改前:" + String.valueOf(val_old)+"、修改后:"+String.valueOf(val_new)+";";
        }else {    
        System.out.println("UpdateLogUtil.UpdateLog:属性【"+name+"】注解使用的name是自定义的值: "+xmlElement.name());    
        remark += xmlElement.name()+"修改前:" + String.valueOf(val_old)+"、修改后:"+String.valueOf(val_new)+";";
        }    
        }    
        }
        }
return remark;
}

}

 

JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值