`

Java比较同类的对象的不同字段的值

    博客分类:
  • Java
阅读更多
public class UserComparTest {
	
	public static void main(String[] args) {
		new UserComparTest().start();
	}
	
	public void start() {
		User user1 = new User();
		user1.setId("1");
		user1.setName("jacktan");
		user1.setPassword("123");
		User user2 = new User();
		user2.setId("1");
		user2.setName("jj");
		user2.setPassword("222222");
		
		List<ChangeInfo> list = compareDetails(user1, user2);
		System.out.println(list);
	}

	public List<ChangeInfo> compareDetails(Object obj,Object obj2) {
		// 存放新旧对象改变的内容
		List<ChangeInfo> list = new ArrayList<ChangeInfo>();
		// 新的对象
		Object newVersion = obj;
		// 旧的对象
		Object oldVersion = obj2;
		// 需要比较的字段
		String[] opDiffNameArray = { "XX编码", "名称", "密码", "XX目的", "XX范围", "XX使用前", "XX使用过程中", "XX使用过程后", "XX注意事项" };
		// 对应的类中的成员变量
		String[] opDiffArray = { "code", "name", "password", "purpose", "range", "beforeUse", "inUse", "afterUse",
				"notice" };
		contrastObj(newVersion, oldVersion, opDiffArray, opDiffNameArray, list);
		return list;
	}

	public void contrastObj(Object pojo1, Object pojo2, String[] diffMemberArray, String[] diffMemberName,
			List<ChangeInfo> diffList) {
		Map<String, Object> diffMap = new HashMap<String, Object>();
		// map存储中英文对应
		for (int i = 0; i < diffMemberArray.length; i++) {
			diffMap.put(diffMemberArray[i], diffMemberName[i]);
		}
		// 英文List
		List<String> diffMember = Arrays.asList(diffMemberArray);
		
		System.out.println(diffMember);
		System.out.println(diffMap);
		
		try {
			Class clazz = pojo1.getClass();
			// 获取obj1的所有字段
			Field[] fields = pojo1.getClass().getDeclaredFields();
			// 遍历obj1所有字段
			for (Field field : fields) {
				// 如果该字段不再Map中遍历下一个字段
				if (!diffMember.contains(field.getName())) {
					continue;
				}
				// 利用反射获取对应字段的get,set方法
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); // 获取get方法
				Method getMethod = pd.getReadMethod();
				Object o1 = null;
				Object o2 = null;
				if (pojo1 != null) {
					// 调用obj1的对应字段的get方法
					o1 = getMethod.invoke(pojo1);
				}
				if (pojo2 != null) {
					// 调用obj2的对应字段的get方法
					o2 = getMethod.invoke(pojo2);
				}
				String str1 = "";
				String str2 = "";
				// 如果对象是日期类型格式化
				if (o1 instanceof Date) {
					str1 = new SimpleDateFormat("yyyy-MM-dd").format(o1);
					str2 = new SimpleDateFormat("yyyy-MM-dd").format(o2);
				} else if (o1 instanceof String) {
					str1 = (String) o1;
					str2 = (String) o2;
				} else {
					continue;
				}
				// 判断返回的对象不相等
				if ((str1 != null && !str1.equals(str2)) || (str2 != null && !str2.equals(str1))) {
					ChangeInfo change = new ChangeInfo();
//					change.title 
//					// 字段英文名称
//					change.setTitle(field.getName());
					change.title = field.getName();
//					// 中文名称
//					change.setName((String) diffMap.get(field.getName()));
					change.name = (String) diffMap.get(field.getName());
					// 旧信息
//					change.setOldInfo(str2);
					change.oldInfo = str2;
					// 新信息
					change.newInfo = str1;
//					change.setNewInfo(str1);
					diffList.add(change);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 存放不同信息的类
	public class ChangeInfo {

		private static final long serialVersionUID = 1L;

		public String title; // 改变标题 (变量名)
		public String name; // 变更项的名称 (中文名)
		public String type; // 变更显示类型(1:显示content内容 2:
								// 显示前后(oldInfo,newInfo)变更信息)
		public String content; // 提示内容
		public String oldInfo; // 之前内容
		public String newInfo; // 之后内容
		@Override
		public String toString() {
			return "ChangeInfo [title=" + title + ", name=" + name + ", type=" + type + ", content=" + content
					+ ", oldInfo=" + oldInfo + ", newInfo=" + newInfo + "]";
		}
	}
}

 

分享到:
评论

相关推荐

    java的Comparator和Comparable.docx

    实现 Comparable 接口意味着对象可以与同类的其他对象进行比较,并定义了一个通用的比较规则。当一个类实现了 Comparable 接口,那么该类的对象就可以直接调用 Collections.sort 或 Arrays.sort 进行排序。 例如,...

    ACCP5.0Java总结

    - 使用类的属性和方法通过`.`操作符,同类内直接调用,不同类则需要创建对象后调用。 - 变量的作用域决定了变量的可见性和生命周期,分为局部、成员和全局作用域。 6. **数组** - 声明数组可以通过数据类型+方...

    java面试大全,从java基础到微服务完整版

    这意味着Java不会自动为类生成一个接受同类实例作为参数的构造方法。如果需要复制对象,通常使用克隆 (`clone`) 方法或其他自定义方法。 #### 四、继承与接口 ##### 10. Java支持多继承吗? - **定义**:Java不...

    JAVA61条面向对象设计的经验原则

    ### JAVA61条面向对象设计的经验原则 #### (1) 所有数据都应该隐藏在所在的类的内部 这一原则强调了封装的概念。封装是面向对象编程的一个核心特性,它允许我们将数据(即类的属性)与操作这些数据的方法捆绑在...

    宠物预约服务系统(java毕业设计亲测)

    它们将Java对象与数据库表进行映射,使得开发者能以面向对象的方式处理数据,减少了手动编写SQL语句的工作量。 4. **MVC设计模式**:模型-视图-控制器(Model-View-Controller)是Web应用常见的设计模式。在本系统...

    2022年最新Java面试题整理.doc

    * 多态:提供了不同底层数据类型的相似接口展示能力,操作可以应用到其他类型的值上面。 * 抽象:把思想从详细的实例中分离出来,创立类时根据功能而不是实现细节。 1.1.1 final, finally, finalize 的区别 * ...

    java基础笔试题目.pdf

    每次调用`dest()`都会创建一个新的`Destination`对象,其中`cost`在每个对象初始化时计算,`label`字段初始化为传入的字符串参数。`readLabel()`方法返回`label`值。 总的来说,理解Java的基础知识,如数组的长度、...

    FASTJSON2是一个性能优异的Java JSON库.zip

    - **自动类型转换**:FASTJSON2能自动将JSON值转化为Java对象,如Date、BigDecimal等,无需手动转换。 - **流式处理**:支持JSON的流式解析和生成,适合处理大数据流,有效降低内存占用。 - **安全增强**:相比...

    fastjson jar包 和 api

    4. **JSONPath支持**:Fastjson实现了类似于jQuery的JSONPath表达式,可以方便地获取JSON对象中的特定字段值,如`JSONPath.eval(json, "$.name")`可以获取JSON对象中name属性的值。 5. **类型转换与兼容性**:...

    很好用的JAVA类转JSON工具:FastJSON (2).docx

    与JsonLib等其他JSON处理库相比,FastJSON虽然在某些高级特性上可能略显不足,但在基本的JSON对象与Java对象之间的转换上表现出色,因此受到了开发者的青睐。本文将详细介绍FastJSON的主要特性和使用方法。 ### 1. ...

    fastjson-1.2.53.jar

    2. 序列化过程:从Java对象到JSON字符串的转换涉及到了反射、类型处理和优化策略,包括字段的忽略、枚举的处理等。 3. 反序列化过程:将JSON字符串转换为Java对象时,Fastjson使用了TypeReference和ASM技术,提高了...

    gson-all.jar

    Gson是Google开发的一款Java库,全称为Google Simple JSON,用于在Java对象和JSON数据之间进行映射。这个库使得Java对象可以轻松地序列化为JSON格式,也可以从JSON字符串反序列化回Java对象。Gson-all.jar是Gson库的...

    JAVA+SQL离散数学题库管理系统(源代码+论文+外文翻译).rar

    在系统设计中,可能会使用到的设计模式有单例模式(确保数据库连接的唯一性)、工厂模式(用于创建题目对象)以及策略模式(用于处理不同类型的题目,如选择题、填空题、解答题等)。此外,面向对象的特性如封装、...

    fastjson该包实现了部分JSON的快速提取

    它能够直接将Java对象转换为JSON字符串,也可以将JSON内容解析为对应的Java对象,这种对象与JSON之间的转换方式被称为序列化和反序列化。 二、主要特性 1. **高性能**:Fastjson在性能上表现优秀,解析和生成速度...

    java编码规范

    ### Java编码规范详解 #### 目的 Java编码规范旨在标准化Java程序的编写方式,确保代码的一致性、可读性和可维护性。通过规范化的编码标准,开发团队能够更高效地协作,减少代码错误,提升软件质量。 #### 概述 本...

    fastjson解析json

    2. **简单易用**:Fastjson提供了简单的API,无论是解析JSON到Java对象,还是将Java对象转换成JSON字符串,都非常直观。 3. **类型安全**:Fastjson支持自动类型转换,可以避免因类型不匹配导致的错误。 4. **流式...

    fast json API+JAR

    - **自动类型转换**:Fastjson能自动识别并处理Java对象的字段类型,无需额外的注解或配置。 - **内存友好**:Fastjson在内存管理上做了优化,避免了不必要的对象创建,减少了内存消耗。 **2. 使用Fastjson的API**...

    fastjson1.2.47

    Fastjson提供简单易用的API,支持将JSON字符串解析为Java对象,同时也能将Java对象转换为JSON格式的字符串。例如: ```java // 将JSON字符串转化为Java对象 String jsonString = "{\"name\":\"John\", \"age\":30}...

    fastjson所用jar包

    2. 在序列化时,Fastjson默认会忽略对象的null值字段,如果需要包含这些字段,需要配置相应的序列化策略。 3. 对于自定义的Java类,需要有无参构造函数,Fastjson才能正确地反序列化。 总的来说,Fastjson是一款...

Global site tag (gtag.js) - Google Analytics