java 记录对象更新前后的对比记录

编程入门 行业动态 更新时间:2024-10-12 05:55:27

java 记录<a href=https://www.elefans.com/category/jswz/34/1771306.html style=对象更新前后的对比记录"/>

java 记录对象更新前后的对比记录

1、java的反射机制,通过注解实现。


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;/*** 自定义注解* @author Administrator**/
@Retention(RetentionPolicy.RUNTIME)
public @interface LogCompar {String value();
}

2、在实体类上添加自定义注解@实体类名称,如:@LogCompar

3、工具类

import java.lang.reflect.Field;
import org.apachemons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aohaichina.sys.domain.User;/*** 对比工具类* @author Administrator**/
public class CompareUtil {private static final Logger LOGGER = LoggerFactory.getLogger(CompareUtil.class);/*** @param oldObj 原数据对象* @param newObj 修改后数据对象*/public String addRecord(Object oldObj, Object newObj){String str = "";try {// 得到类对象Class<? extends Object> class1 = oldObj.getClass();Class<? extends Object> class2 = newObj.getClass();if(!class1.equals(class2)){throw new RuntimeException("请传入两个相同的实体类对象");}// 得到属性集合Field[] fields1 = class1.getDeclaredFields();Field[] fields2 = class2.getDeclaredFields();StringBuffer info = new StringBuffer();Long id = null;int i=1;for (Field field1 : fields1) {field1.setAccessible(true);    // 设置属性是可以访问的(私有的也可以)if(id == null && field1.getName().equals("id")){id = (Long)field1.get(oldObj);}for (Field field2 : fields2) {field2.setAccessible(true);    // 设置属性是可以访问的(私有的也可以)if(field1.equals(field2)){    // 比较属性名是否一样if(field2.get(newObj) == null || StringUtils.isEmpty(field2.get(newObj) + "")){break;    // 属性名称一样就退出二级循环}if(!field1.get(oldObj).equals(field2.get(newObj))){    // 比较属性值是否一样// 得到注解LogCompar pn = field1.getAnnotation(LogCompar.class);if(pn != null){if(i!=1){str+=",";}str +=""+pn.value() + ":\"" +  field1.get(oldObj) + "\" 改成 \"" + field2.get(newObj) + "\""+""; i++;}}break;    // 属性名称一样就退出二级循环}}}if(info.length() != 0){// 设置日志信息System.out.println(info.length() == 0 ? info.toString() : info.substring(0, info.length() - 1));}} catch (RuntimeException e) {e.printStackTrace();LOGGER.error(e.getMessage());} catch (Exception e) {e.printStackTrace();LOGGER.error("属性内容更改前后验证错误,日志无法被记录!");}return str;}/*** 测试* @param args*/public static void main(String[] args) {User u1 = new User();u1.setLoginname("T-1711");u1.setName("pbm");User u2 = new User();u2.setLoginname("T-1722");u2.setName("pbm2");CompareUtil compareUtil = new CompareUtil();String resultIn =  compareUtil.addRecord(u1,u2);System.out.println(resultIn);}
}

4、运行结果

更多推荐

java 记录对象更新前后的对比记录

本文发布于:2024-03-23 02:12:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739234.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:对象   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!