非常实用的java比较器,贴上代码:
import java.util.HashSet; import java.util.List; import java.util.Set; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mchange.v1.lang.NullUtils; @SuppressWarnings("deprecation") public class JVisaCommonCompare { private static Logger LOGGER = LoggerFactory.getLogger(JVisaCommonCompare.class); /** 获取不同值的字段(可以不同类型) */ public static <S extends Object, T extends Object> Set<String> getDifferentFieldName(S source, T target, List<String> excludeFieldName) { LOGGER.info("======================getDifferentFieldName,source:[{}],target:[{}]", ToStringBuilder.reflectionToString(source), ToStringBuilder.reflectionToString(target)); Set<String> fieldName = new HashSet<>(); if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) { return fieldName; } JsonConfig config = new JsonConfig(); if (!CollectionUtils.isEmpty(excludeFieldName)) { String[] excludeArray = excludeFieldName.toArray(new String[excludeFieldName.size()]); config.setExcludes(excludeArray); } JSONObject sourceObj = JSONObject.fromObject(source, config); JSONObject targetObj = JSONObject.fromObject(target, config); fieldName = getAllDifferentFieldName(sourceObj, targetObj, config); LOGGER.info("======================getDifferentFieldName,result:[{}]", fieldName); return fieldName; } /** 判断两个对象是否每个字段都相等 */ public static <S extends Object, T extends Object> Boolean isAllTheSameOfObject(S source, T target, List<String> excludeFieldName) { LOGGER.info("======================isAllTheSameOfObject,source:[{}],target:[{}]", ToStringBuilder.reflectionToString(source), ToStringBuilder.reflectionToString(target)); Set<String> fieldName = new HashSet<>(); if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) { return true; } JsonConfig config = new JsonConfig(); if (!CollectionUtils.isEmpty(excludeFieldName)) { String[] excludeArray = excludeFieldName.toArray(new String[excludeFieldName.size()]); config.setExcludes(excludeArray); } JSONObject sourceObj = JSONObject.fromObject(source, config); JSONObject targetObj = JSONObject.fromObject(target, config); fieldName = getAllDifferentFieldName(sourceObj, targetObj, config); if (CollectionUtils.isEmpty(fieldName)) { return true; } return false; } /** 获取不同值的字段名字(任何不同类型比较) */ @SuppressWarnings({ "unused", "unchecked" }) private static Set<String> getAllDifferentFieldName(JSONObject source, JSONObject target, JsonConfig config) { Set<String> fieldName = new HashSet<>(); if (BooleanUtils.isTrue(NullUtils.equalsOrBothNull(source, target))) { return fieldName; } // if exist JSONObject is null if (BooleanUtils.isTrue(source.isNullObject())) { fieldName = new HashSet<>(JSONArray.toCollection(config == null ? target.names() : target.names(config))); return fieldName; } if (BooleanUtils.isTrue(target.isNullObject())) { fieldName = new HashSet<>(JSONArray.toCollection(config == null ? source.names() : source.names(config))); return fieldName; } // set the config of field JSONArray fieldKeySource = null; JSONArray fieldKeyTarget = null; if (null != config) { fieldKeySource = source.names(config); fieldKeyTarget = target.names(config); } else { fieldKeySource = source.names(); fieldKeyTarget = source.names(); } // compare for (int sindex = 0; null != fieldKeySource && sindex < fieldKeySource.size(); sindex++) { Object key = fieldKeySource.get(sindex); if (!BooleanUtils.isTrue(target.containsKey(key))) { fieldName.add((String) key); continue; } Object value1 = source.get(key); Object value2 = target.get(key); if (!ObjectUtils.equals(value1, value2)) { fieldName.add((String) key); } } for (int tindex = 0; null != fieldKeyTarget && tindex < fieldKeyTarget.size(); tindex++) { Object key = fieldKeyTarget.get(tindex); if (!BooleanUtils.isTrue(source.containsKey(key))) { fieldName.add((String) key); continue; } Object value2 = target.get(key); Object value1 = source.get(key); if (!ObjectUtils.equals(value2, value1)) { fieldName.add((String) key); } } return fieldName; } }
相关推荐
总的来说,"jar包差异比较器"是Java开发者必备的工具之一,它的价值在于能有效提升软件维护和管理的效率,帮助开发者快速定位问题,确保软件的质量和稳定性。在使用时,应结合源代码管理工具如Git,共同构建起完善的...
在Java开发中,有时我们需要获取数据库表的字段信息,例如字段名称、字段类型等,以便在编程时创建对应的Java实体类。为了简化这一过程,我们可以编写一个工具类来实现这个功能。下面是一个简单的示例,展示了如何...
根据提供的信息,我们可以总结出以下有关“Java文件选择器”的知识点: ### Java 文件选择器概述 在Java开发中,文件选择器是一种常见的图形用户界面组件,用于帮助用户从文件系统中选择文件或目录。通常,这涉及...
- `findEditedItems(List<T> oldList, List<T> newList, Comparator<T> comparator)`:根据比较器找出被编辑的元素。 - `findDeletedItems(List<T> oldList, List<T> newList)`:返回在`newList`中被删除的元素。 ...
此外,还可能涉及泛型、迭代器和比较器的概念。 6. **输入输出流**:I/O流的概念,包括字节流和字符流,以及FileInputStream、FileOutputStream、BufferedReader、PrintWriter等类的使用。 7. **多线程**:线程的...
- 构造器、方法和字段的反射API。 11. **设计模式**: - 单例模式,工厂模式,装饰器模式,观察者模式等常见设计模式的应用。 12. **JVM优化**: - 参数调整:堆大小,新生代与老年代比例,GC策略等。 - 性能...
比较两个类是否相等,实际上是比较它们的`Class`对象是否相同。 #### 二、获取类信息的方法 反射提供了多种方法来获取类的详细信息,包括但不限于: 1. **`getName()`**: 返回类的全名。 2. **`getSuperClass()`*...
在下载器中,多线程技术可以被用来并行下载文件的不同部分,从而提高下载效率。每个线程负责下载文件的一部分,当所有线程完成其任务后,将各个部分合并成完整的文件。 ### 3. 分块下载 在多线程下载中,大文件会被...
* 数组列表(ArrayList):可以排序,需要提供比较器(Comparator)或者实现 Comparable 接口 * linkedList:有序的链表,可以排序 * Vector:线程安全的集合,可以排序 * Set:无序、不可重复的集合 + HashSet:不...
8. **方法重载(Overloading)**:在同一个类中,如果方法名字相同但参数列表不同,就构成了方法重载。编译器会根据传入的参数类型选择合适的方法执行。 9. **包(Package)**:包是Java组织类的一种方式,可以将...
包括迭代器、比较器、并发集合、Lambda表达式和Stream API等内容,这些是提高代码效率和简洁性的关键工具。 十八、JavaFX JavaFX是一个用于构建桌面、移动和嵌入式设备的富客户端应用程序的框架,提供了丰富的UI...
多态则是在不同对象上调用相同方法时表现出不同行为的能力。 - **构造器与this关键字**:构造器用于初始化对象,this关键字用来引用当前对象实例。 - **访问修饰符**:public、private、protected和默认访问修饰符...
1. **`java.lang.reflect.Field`** —— 表示类中的字段(属性),可以用来获取或设置字段的值。 2. **`java.lang.reflect.Method`** —— 表示类中的方法,可以用来调用对象的方法。 3. **`java.lang.reflect....
- **类的定义**:封装、继承和多态三大特性,以及构造器的使用。 - **对象的创建与销毁**:实例化过程,对象的生命周期,以及垃圾回收机制。 - **访问修饰符**:public、private、protected和默认访问修饰符的...
JAVA分为多个版本,如JDK(Java Development Kit)、JRE(Java Runtime Environment)和不同的服务端版本。JAVA程序的运行机制基于JVM(Java Virtual Machine),JVM使得JAVA程序可以在任何支持JVM的平台上运行。JRE...
还会讨论泛型、迭代器和比较器的概念。 3. **2类、对象和接口.ppt**: 类和对象是面向对象编程的基础。这部分会讲解如何定义类,包括属性(字段)和方法(函数),以及如何创建和实例化对象。接口作为契约,定义了...
### Java全阶段综合笔试面试题知识点解析 #### 一阶段:基础知识点 1. **JRE、JDK、JVM的关系** - **JRE** (Java Runtime Environment): 包括了Java虚拟机(JVM)及Java核心类库,是运行Java程序所需的环境。 - **...
2. **集合框架**:Java集合框架是面试中常考的部分,包括List、Set、Queue、Map等接口及其实现类如ArrayList、LinkedList、HashSet、HashMap等的特性和用法,以及泛型、迭代器、比较器等概念。 3. **多线程与并发**...
18. **Java集合高级**:TreeSet、TreeMap、LinkedHashMap等集合类的特性,以及集合框架中的迭代器和比较器。 19. **Java网络编程**:Socket编程,ServerSocket的使用,以及基于HTTP协议的网络通信。 20. **Java...