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集合内对象的属性值是否发生变更的更多相关文章

  1. Java Dom对XML的解析和修改操作

    与Dom4J和JDom对XML的操作类似,JDK提供的JavaDom解析器用起来一样方便,在解析XML方面Java DOM甚至更甚前两者一筹!其不足之处在于对XML的增删改比较繁琐,特开篇介绍... ...

  2. java对excel文件内容读写修改操作

    Read.java package domain; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cel ...

  3. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  4. Java的反射机制和动态代理

    介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原 ...

  5. java面试(反射)05

    1.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类信息以及动态调用对象内容就称为jav ...

  6. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  7. java笔记--反射进阶之总结与详解

    一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...

  8. Java API —— 反射

    1.类加载器     1)类的加载         · 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化.         · 加载 :就是 ...

  9. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

随机推荐

  1. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  2. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  3. HTML 图像显示

    HTML 图像显示:图像标签:<img>,源属性:Src<img>是空标签,没有闭合标签,它只包含属性:显示图像时需要调用源属性src:src的值是图像的地址:语法:<i ...

  4. JS-Dom概念

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  5. javascript笔记---貌似大叔

    1.原型式继承和类式继承的区别 在基于类的面向对象方式中,对象(object)依靠类(class)来产生.而在基于原型的面向对象方式中,对象(object)则是依靠 构造器(constructor)利 ...

  6. 【安全组网】思科IOS设备基础应用

    思科IOS有2种主要命令行模式:用户模式与特权模式 1.用户模式(user mode),当用“>”表示实在用户模式下 2.特权模式(exec mode),当用"#"表示是在特 ...

  7. Linux复制指定目录下的文件夹结构

    [root@ebs12vis ~]# su - applmgr[applmgr@ebs12vis ~]$ cd $APPL_TOP/inv[applmgr@ebs12vis inv]$ find . ...

  8. C程序第一次作业

    1-1 计算两数的和与差 1 设计思路 (1)主要描述题目算法 第一步:利用指针psum接收sum的地址,指针pdiff接收diff的地址,因此 * psum为sum, * pdiff为diff. 第 ...

  9. AWS Nginx Started but not Serving AWS上Nginx服务器无法正常工作

    After install the Nginx on AWS instance, and visit your public ip address, you might see the followi ...

  10. ansible笔记(11):初识ansible playbook(二)

    ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...