【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更
java的反射实现:
判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更
今日份代码:
package com.sxd.streamTest; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature; import java.lang.reflect.Field;
import java.util.*; /**
* @ClassName Test
* @Description 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更
* @Author sxd
* @Date 2020/02/14 10:07
* @Version 1.0
*/
public class Test { //忽略的属性
List<String> ignoreFields = Arrays.asList("yn","id"); /**
* 测试的入口方法,实例化几个对象
*/
@org.junit.Test
public void test(){
Date modifyTime = new Date();
Date modifyTime2 = new Date();
List<Long> list1 = new ArrayList<>();
list1.add(1L);
list1.add(2L); List<Long> list2 = new ArrayList<>();
list1.add(1L); Student student1 = new Student();
student1.setAge(1);
student1.setName("张三1");
student1.setModifyTime(modifyTime);
student1.setStoreIdList(list1);
student1.setYn(1); Student student2 = new Student();
student2.setAge(1);
student2.setName("张三1");
student2.setModifyTime(modifyTime2);
student2.setStoreIdList(list2);
student2.setYn(-1); Student student3 = new Student();
student3.setAge(3);
student3.setName("张三3");
student3.setModifyTime(modifyTime);
student3.setYn(1); Student student4 = new Student();
student4.setAge(4);
student4.setName("张三4");
student4.setModifyTime(modifyTime2);
student4.setYn(-1); Student student5 = new Student();
student5.setAge(4);
student5.setName("张三4");
student5.setModifyTime(modifyTime2);
student5.setYn(11); List<Student> sList1 = Arrays.asList(student2,student1);
List<Student> sList2 = Arrays.asList(student4,student3); System.out.println("List集合是否变更:" + listModifyContrast(sList2,sList1));
System.out.println("单个对象是否变更:" + objModifyContrast(student4,student5,false));
} /**
* List数据变更对比
* 比较两个相同泛型的List集合中值是否相同
* @param newList
* @param oldList
* @return true有变更 false无变更
*/
public Boolean listModifyContrast(List<? extends Object> newList, List<? extends Object> oldList){
boolean flag = false;
if (newList != null && oldList != null){
if (newList.size() != oldList.size()){
flag = true;
}else {
int same = 0; for (Object newObj : newList) {
for (Object oldObj : oldList) {
if (isBaseType(newObj)){
if (newObj == oldObj){
same ++;
}
}else {
if (!objModifyContrast(newObj,oldObj,false)){
same ++;
}
}
}
}
if (same != newList.size()){
flag = true;
}
}
}else {
if (newList == null && oldList == null){
flag = false;
}else {
flag = true;
}
}
return flag;
} /**
* 判断obj是否基本数据类型
* 这里Integer和int 都认定为基本类型
* @param obj
* @return
*/
private boolean isBaseType(Object obj){
Class aClass = obj.getClass();
if (aClass == Integer.class || aClass ==Integer.TYPE
|| aClass == Byte.class || aClass == Byte.TYPE
|| aClass == Short.class || aClass == Short.TYPE
|| aClass == Character.class || aClass == Character.TYPE
|| aClass == Long.class || aClass == Long.TYPE
|| aClass == Double.class || aClass == Double.TYPE
|| aClass == Float.class || aClass == Float.TYPE
|| aClass == Boolean.class || aClass == Boolean.TYPE
){
return true;
}else {
return false;
}
} /**
* 单个对象-属性修改对比
* 属性如果是集合类型,则要求泛型需要重写hashCode和equals方法
* @param newObj
* @param oldObj
* @param reset 是否重置属性
* @return true有变更 false无变更
*/
public Boolean objModifyContrast(Object newObj,Object oldObj,boolean reset){
boolean flag = false; if (newObj != null && oldObj != null){
Map<String, Object> newMap = getReflexMap(newObj);
Map<String, Object> oldMap = getReflexMap(oldObj); int diff = 0;
for (String field : newMap.keySet()) {
if (! ignoreFields.contains(field)){ Object newFieldValue = newMap.get(field);
Object oldFieldValue = oldMap.get(field);
if (newFieldValue != null && oldFieldValue != null){
if (newFieldValue.equals(oldFieldValue)){
if (reset){
newMap.put(field,null);
oldMap.put(field,null);
}
}else {
diff ++;
}
}else {
if (!(newFieldValue == null && oldFieldValue == null)){
diff ++;
}
}
}
} if (diff > 0){
setReflexObj(newMap, newObj);
setReflexObj(oldMap, oldObj);
flag = true;
}else {
flag = false;
}
}else {
if (newObj == null && oldObj == null){
flag = false;
}else {
flag = true;
}
}
return flag;
} /**
* 获取对象的属性名 + 属性值
* @param obj
* @return
*/
public Map<String,Object> getReflexMap(Object obj){
Map<String,Object> map = new HashMap<>(); Class<? extends Object> aClass = obj.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
String fieldName = declaredField.getName();
Object fieldValue = null;
try {
fieldValue = declaredField.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
} map.put(fieldName,fieldValue);
}
return map;
} /**
* 设置 对象的 属性名+属性值
* @param map
* @return
*/
public Object setReflexObj(Map<String,Object> map,Object obj){
Set<String> fieldSet = map.keySet();
Class<? extends Object> aClass = obj.getClass();
for (String field : fieldSet) {
try {
Field declaredField = aClass.getDeclaredField(field);
declaredField.setAccessible(true);
declaredField.set(obj,map.get(field));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return obj;
} }
【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更的更多相关文章
- Java Dom对XML的解析和修改操作
与Dom4J和JDom对XML的操作类似,JDK提供的JavaDom解析器用起来一样方便,在解析XML方面Java DOM甚至更甚前两者一筹!其不足之处在于对XML的增删改比较繁琐,特开篇介绍... ...
- java对excel文件内容读写修改操作
Read.java package domain; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cel ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- Java的反射机制和动态代理
介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...
- java面试(反射)05
1.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类信息以及动态调用对象内容就称为jav ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- Java API —— 反射
1.类加载器 1)类的加载 · 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. · 加载 :就是 ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
随机推荐
- linux磁盘扩容常见问题
1.对于云主机可以对硬盘进行在线扩容,如果不方便重启服务器,可以键入以下命令系统能够马上识别新增空间: echo '1' > /sys/class/scsi_disk/0\:0\:0\:0/de ...
- request DELETE 请求
Django对于PUT/DELETE请求并没有像POST/GET那样有一个字典结构.我们需要手动处理request.body获取参数: 第一种方式: ujson.loads(request.body. ...
- 解决 /actuator/beans不能访问
在Spring Boot中配置了actuator,能够访问到/actuator/health,但是在访问/actuator/beans的时候却显示如下404错误. 原因是 /actuator/heal ...
- css 盒子模型应用
盒子模型应用 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- 使用IDEA,Eclispe搭建Spring Boot项目
如何创建一个Spring Boot项目?这里使用maven来进行依赖管理,根据常用的IDE,可以使用IDEA.Eclipse.或者访问官方网站搭建. 项目搭建环境准备 JDK:1.8 MAVEN:3. ...
- JS enter键一键登录
$("body").keydown(function (event) { ) { //enter键键值为13 $('.finish-btn').click(); // $('.fi ...
- MyBatisPlus代码生成 mvc项目
package com.test; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus ...
- Windows篇:链接linux->"Xmanager"
Windows篇:链接linux->"Xmanager" Xmanager是什么? Xmanager是一款小巧.便捷的浏览远端X窗口系统的工具.在工作中经常使用Xmanage ...
- 大数据萌新的Python学习之路(二)
笔记内容: 一.模块 Python越来越被广大程序员使用,越来越火爆的原因是因为Python有非常丰富和强大标准库和第三方库,几乎可以实现你所想要实现的任何功能,并且都有相应的Python库支持,比如 ...
- 前端学习笔记系列一:12 js中获取时间new date()的用法
获取时间: 1 var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.get ...