比较Java对象中属性的不同

前言

今天同事提了一个需求让我做,大概意思在对一个用户的属性进行编辑后,在数据库中记录操作日志,主要就是记录被修改属性修改前后的值。这个问题简化一下就是判断一个类的两个对象属性值的不同。

两个对象进行比较相等,有两种做法:
1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可。
2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射。也可以先把对象转成Json串,再依次进行比较。

为了后面的举例,我们先新建一个简单的类Student:

package test; /* *author:Marin *time: */ public class Student { private String stuid; private String stduname; private Integer age; public String getStuid() { return stuid; } public void setStuid(String stuid) { this.stuid = stuid; } public String getStduname() { return stduname; } public void setStduname(String stduname) { this.stduname = stduname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

通过类反射比较两个对象的不同

package test; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; /* *author:Marin *time: */ public class test1 { public static void main(String[] args) { Student student1=new Student(); student1.setStuid("08163312"); student1.setStduname("小马"); student1.setAge(21); Student student2=new Student(); student2.setStuid("08163311"); student2.setStduname("小马"); student2.setAge(19); Map<String, String> orgobj = new HashMap<String, String>(); Map<String, String> nowobj = new HashMap<String, String>(); Field[] fs = student1.getClass().getDeclaredFields(); for (Field f : fs) { f.setAccessible(true); Object v1 = null; Object v2 = null; try { v1 = f.get(student1); v2 = f.get(student2); } catch (IllegalArgumentException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (!equals(v1, v2)) { orgobj.put(f.getName(), v1.toString()); nowobj.put(f.getName(), v2.toString()); } } System.err.println(orgobj.toString()); System.err.println(nowobj.toString()); } public static boolean equals(Object obj1, Object obj2) { if (obj1 == obj2) { return true; } if (obj1 == null || obj2 == null) { return false; } return obj1.equals(obj2); } }

通过JSON串来比较两个对象属性的不同

package test; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; /* *author:Marin *time: */ public class test2 { public static void main(String[] args) { // TODO Auto-generated method stub Student student1=new Student(); student1.setStuid("08163312"); student1.setStduname("小马"); student1.setAge(21); Student student2=new Student(); student2.setStuid("08163311"); student2.setStduname("小马"); student2.setAge(19); JSONObject obj1 = JSONObject.fromObject(student1); JSONObject obj2 = JSONObject.fromObject(student2); Map orgobj = new HashMap(); Map nowobj = new HashMap(); for(int i=0;i<obj1.names().size();i++){ if(!isTheSame(obj1, obj2, i)){ orgobj.put(obj1.names().get(i), obj1.get(obj1.names().get(i).toString())); nowobj.put(obj2.names().get(i), obj2.get(obj2.names().get(i).toString())); } } System.err.println(orgobj.toString()); System.err.println(nowobj.toString()); } private static boolean isTheSame(JSONObject obj1, JSONObject obj2, int i) { return obj1.get(obj1.names().get(i)).equals(obj2.get(obj1.names().get(i)).toString()); } }

 


__EOF__

本文作者心若向阳,无畏悲伤
本文链接https://www.cnblogs.com/WinterRain/p/13748855.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   .有梦想的咸鱼丶  阅读(1227)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示