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 + "]"; } } }
相关推荐
实现 Comparable 接口意味着对象可以与同类的其他对象进行比较,并定义了一个通用的比较规则。当一个类实现了 Comparable 接口,那么该类的对象就可以直接调用 Collections.sort 或 Arrays.sort 进行排序。 例如,...
- 使用类的属性和方法通过`.`操作符,同类内直接调用,不同类则需要创建对象后调用。 - 变量的作用域决定了变量的可见性和生命周期,分为局部、成员和全局作用域。 6. **数组** - 声明数组可以通过数据类型+方...
这意味着Java不会自动为类生成一个接受同类实例作为参数的构造方法。如果需要复制对象,通常使用克隆 (`clone`) 方法或其他自定义方法。 #### 四、继承与接口 ##### 10. Java支持多继承吗? - **定义**:Java不...
### JAVA61条面向对象设计的经验原则 #### (1) 所有数据都应该隐藏在所在的类的内部 这一原则强调了封装的概念。封装是面向对象编程的一个核心特性,它允许我们将数据(即类的属性)与操作这些数据的方法捆绑在...
它们将Java对象与数据库表进行映射,使得开发者能以面向对象的方式处理数据,减少了手动编写SQL语句的工作量。 4. **MVC设计模式**:模型-视图-控制器(Model-View-Controller)是Web应用常见的设计模式。在本系统...
* 多态:提供了不同底层数据类型的相似接口展示能力,操作可以应用到其他类型的值上面。 * 抽象:把思想从详细的实例中分离出来,创立类时根据功能而不是实现细节。 1.1.1 final, finally, finalize 的区别 * ...
每次调用`dest()`都会创建一个新的`Destination`对象,其中`cost`在每个对象初始化时计算,`label`字段初始化为传入的字符串参数。`readLabel()`方法返回`label`值。 总的来说,理解Java的基础知识,如数组的长度、...
- **自动类型转换**:FASTJSON2能自动将JSON值转化为Java对象,如Date、BigDecimal等,无需手动转换。 - **流式处理**:支持JSON的流式解析和生成,适合处理大数据流,有效降低内存占用。 - **安全增强**:相比...
4. **JSONPath支持**:Fastjson实现了类似于jQuery的JSONPath表达式,可以方便地获取JSON对象中的特定字段值,如`JSONPath.eval(json, "$.name")`可以获取JSON对象中name属性的值。 5. **类型转换与兼容性**:...
与JsonLib等其他JSON处理库相比,FastJSON虽然在某些高级特性上可能略显不足,但在基本的JSON对象与Java对象之间的转换上表现出色,因此受到了开发者的青睐。本文将详细介绍FastJSON的主要特性和使用方法。 ### 1. ...
2. 序列化过程:从Java对象到JSON字符串的转换涉及到了反射、类型处理和优化策略,包括字段的忽略、枚举的处理等。 3. 反序列化过程:将JSON字符串转换为Java对象时,Fastjson使用了TypeReference和ASM技术,提高了...
Gson是Google开发的一款Java库,全称为Google Simple JSON,用于在Java对象和JSON数据之间进行映射。这个库使得Java对象可以轻松地序列化为JSON格式,也可以从JSON字符串反序列化回Java对象。Gson-all.jar是Gson库的...
在系统设计中,可能会使用到的设计模式有单例模式(确保数据库连接的唯一性)、工厂模式(用于创建题目对象)以及策略模式(用于处理不同类型的题目,如选择题、填空题、解答题等)。此外,面向对象的特性如封装、...
它能够直接将Java对象转换为JSON字符串,也可以将JSON内容解析为对应的Java对象,这种对象与JSON之间的转换方式被称为序列化和反序列化。 二、主要特性 1. **高性能**:Fastjson在性能上表现优秀,解析和生成速度...
### Java编码规范详解 #### 目的 Java编码规范旨在标准化Java程序的编写方式,确保代码的一致性、可读性和可维护性。通过规范化的编码标准,开发团队能够更高效地协作,减少代码错误,提升软件质量。 #### 概述 本...
2. **简单易用**:Fastjson提供了简单的API,无论是解析JSON到Java对象,还是将Java对象转换成JSON字符串,都非常直观。 3. **类型安全**:Fastjson支持自动类型转换,可以避免因类型不匹配导致的错误。 4. **流式...
- **自动类型转换**:Fastjson能自动识别并处理Java对象的字段类型,无需额外的注解或配置。 - **内存友好**:Fastjson在内存管理上做了优化,避免了不必要的对象创建,减少了内存消耗。 **2. 使用Fastjson的API**...
Fastjson提供简单易用的API,支持将JSON字符串解析为Java对象,同时也能将Java对象转换为JSON格式的字符串。例如: ```java // 将JSON字符串转化为Java对象 String jsonString = "{\"name\":\"John\", \"age\":30}...
2. 在序列化时,Fastjson默认会忽略对象的null值字段,如果需要包含这些字段,需要配置相应的序列化策略。 3. 对于自定义的Java类,需要有无参构造函数,Fastjson才能正确地反序列化。 总的来说,Fastjson是一款...