`

java利用反射比较2个对象相关属性 (可以自定义比较属性)

    博客分类:
  • java
 
阅读更多
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class CompareObjByFileds {
	private static CompareObjByFileds compaeObjByFileds = null; 
	private CompareObjByFileds() { } 
	public static synchronized CompareObjByFileds newInstance() { 
		if (compaeObjByFileds == null){   
			compaeObjByFileds = new CompareObjByFileds();  
		}  return compaeObjByFileds; 
	} 
	@SuppressWarnings({"unchecked"}) 
	public boolean compaeObj(Object obj1, Object obj2, String[] params) throws IllegalArgumentException, IllegalAccessException {  
		// 如果params 为空则认为两个对象相等 
		if( params == null || params.length == 0)  
			return true; 
		Class classObj1 = obj1.getClass();  
		Class classObj2 = obj2.getClass();  
		//利用反射拿到相关属性 
		Field[] declaredFields1 = classObj1.getDeclaredFields();  
		Field[] declaredFields2 = classObj2.getDeclaredFields();  
		//实体属性名称
		String fieldName = null;  Class type = null;  
		//属性类型  
		String factType = null;  
		String value = null;  
		Object convert = null;  
		Map<String, String[]> map1 = new HashMap<String, String[]>();  
		Map<String, String[]> map2 = new HashMap<String, String[]>();  
		//便利Obj1对象 拿到Obj1对象属性名和对应的值,并放到map中  
		for (Field fieldObj1 : declaredFields1) {   
			fieldName = fieldObj1.getName();   
			type = fieldObj1.getType();   
			factType = type.toString();  
			factType = factType.substring(factType.indexOf(32) + 1);   
			fieldObj1.setAccessible(true);   convert = fieldObj1.get(obj1);  
			value = convert == null ? null: convert.toString();   
			map1.put(fieldName, new String[]{factType, value});  
		} 
		for (Field fieldObj2 : declaredFields2) {   
			fieldName = fieldObj2.getName();   
			type = fieldObj2.getType();   
			factType = type.toString();   
			factType = factType.substring(factType.indexOf(32) + 1);   
			fieldObj2.setAccessible(true);   convert = fieldObj2.get(obj2);   
			value = convert == null ? null: convert.toString();   
			map2.put(fieldName, new String[]{factType, value});  
		}  
		String[] array1 = null, array2 = null;  
		String type1 = null, type2 = null;  
		String value1 = null, value2 = null;  
		for (String string : params) {  
			array1 = map1.get(string);  
			array2 = map2.get(string);   
			type1 = array1[0];   
			type2 = array2[0];   
			value1 = array1[1];   
			value2 = array2[1];   
			// params 中的字段,在obj1 和obj2 中都没有则继续比较  
			if(!map1.containsKey(string) && !map2.containsKey(string))    continue;   
			// params 中的字段,在obj1 和obj2 中一个有一个没有则两对象不相等   
			if(!(map1.containsKey(string) && map2.containsKey(string)))    return false;   
			// params 中的字段,在obj1 和obj2 中值一个为空一个不为空且则两对象不相等   
			if((value1 == null && value2 != null) || (value1 != null && value2 == null))    return false;   
			// params 中的字段,在obj1 和obj2 中值不为空且不等则两对象不相等  
			if(value1 != null && value2 != null && !value1.equals(value2))    return false;   
			// params 中的字段,在obj1 和obj2 中值均空则两对象不相等 
			if(value1 == null && value2 == null)    
				return true; 
		}  
		return true; 
	}
}
}
}
}

 

分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的简单类 useArray1.java 用反射机制使用数组示例1 ...

    java实现页面表格数据输出到excel

    * 这是一个通用的方法,利用了JAVA的反射机制, * 可以将放置在JAVA集合中并且符合一定条件的数据以EXCEL的形式输 出到指定IO设备上 * @param title 表格标题名 * @param headers 表格属性列名数组 * @...

    疯狂JAVA讲义

    学生提问:构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象? 141 5.5.2 构造器的重载 142 学生提问:为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器...

    java 编程入门思考

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Java初学者入门教学

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    java联想(中文)

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    java基础案例与开发详解案例源码全

    16.5 利用反射获取注解信息438 16.6 上机练习440 17.1 功能描述442 17.2 总体设计442 17.3 代码实现442 17.4 程序的运行与发布457 17.5 本章练习460 第18章 18.1 JDBC简介462 18.2 JDBC类和接口462 18.2.1 ...

    JAVA_Thinking in Java

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    java注解之运行时修改字段的注解值操作

    主要介绍了java注解之运行时修改字段的注解值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Thinking in Java简体中文(全)

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...

    Thinking in Java 中文第四版+习题答案

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的...

    Java开发技术大全 电子版

    9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取成员方法信息295 9.6.3获取构造方法信息296 9.6.4获取类的成员属性297 9.6.5根据方法的名称来执行方法299 9.6.6创建新的...

    \java超强笔记(超级经典)

    解析注释:利用反射 1、Class.forName() 2、getMethod 3、判断是否有注释 4、getAnnotation 并发线程: 三个多线程包: java.util.concurrent 包含了常用的多线程工具,是新的多线程工具的主体...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm ------------------------------------------------- 本教程由yyc,spirit整理 ------------------------------------------------- “Thinking in Java...

    Think in Java(中文版)chm格式

    2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 ...

    Java典型模块

    第2章 Java面向对象编程 2.1 面向对象的一些概念 2.1.1 面向对象涉及的概念 2.1.2 类和对象 2.2 面向对象的一些特性 2.2.1 继承特性 2.2.2 多态特性 2.2.3 封装特性 2.3 Java中实现的面向对象特性 2.3.1 定义类 ...

    JAVA 范例大全 光盘 资源

    实例2 第一个Java程序 3 实例3 在Eclipse中创建第一个Java程序 4 常见问题 javac不是内部或者外部命令 6 常见问题 找不到类文件 6 常见问题 语法错误 7 第2章 Java基础语法 9 实例4 变量和常量 9 实例5 基本...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例160 利用反射重写toString()方法 208 实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见...

Global site tag (gtag.js) - Google Analytics