`
落叶换新叶
  • 浏览: 24355 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java 反射 比较两个对象 把不同值的字段返回给前段

阅读更多

1、比较类

package com.test.classreflection;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
 * 比较类
 * @author LIUHE524
 *
 */
public class ClassAttrValCompare {
	
	private DifferenceAttr differenceAttr;
	
	public ClassAttrValCompare() {
		differenceAttr = new DifferenceAttr();
	}
	/**
	 * 比较单个值
	 * @param objA
	 * @return
	 */
	public DifferenceAttr compareValue(Object objA) {
		DifferenceAttr differAttr = new DifferenceAttr();
		try{			
			List<String> differenceAttrs = new ArrayList<String>();
			List<DifferenceAttr> childDifferenceAttr = new ArrayList<DifferenceAttr>();
			Class<?> clazzA = objA.getClass();
			Method[] methods = clazzA.getDeclaredMethods();
			Object result = null;
			for(Method method:methods) {
				if(method.getName().startsWith("get")) {
					result = method.invoke(objA, null);
					if(result==null) {
						continue;
					}
					if(result instanceof List) {
						List<Object> childList = (List)result;
						for(Object object:childList) {
							childDifferenceAttr.add(compareValue(object));
						}
					}else {
						String nameTrim = method.getName().substring(3);
						nameTrim = nameTrim.substring(0,1).toLowerCase()+nameTrim.substring(1);
						differenceAttrs.add(nameTrim);
					}
				}
			}
			differAttr.setDifferenceAttrs(differenceAttrs);
			differAttr.setChildrenDifference(childDifferenceAttr);
		}catch(Exception e) {
			e.printStackTrace();
		}
		return differAttr;
	}
    /**
     * 两个对象值的对比(objA为对比)
     * @param objA
     * @param objB
     * @return
     */
	public DifferenceAttr compareValue(Object objA,Object objB) {
		DifferenceAttr differenceAttr = new DifferenceAttr();
		//值都为空,则返回
		if(objA==null&&objB==null) {
			return null;
		}
		//objA不为空,objB为空,则把返回objA所有字段
		if(objA!=null&&objB==null) {
			return compareValue(objA);
		}
		//当前类差异集合
		List<String> differenceAttrs = new ArrayList<String>();
		//子集合查询集合
		List<DifferenceAttr> childrenDifference = new ArrayList<DifferenceAttr>();
		
		try {
			Class<?> clazzA = objA.getClass();
			Class<?> clazzB = objB.getClass();
			Method[] methods = clazzA.getDeclaredMethods();
			Object resultA = null;
			Object resultB = null;
			Method methodB = null;
			for(Method method:methods) {
				if(method.getName().startsWith("get")) {				
					methodB = clazzB.getMethod(method.getName(), null);
					resultB = methodB.invoke(objB, null);
					resultA = method.invoke(objA, null);
					if(resultA==null&&resultB==null) {
						continue;
					}
					
					if(resultA==null&&resultB!=null) {
						differenceAttrs.add(method.getName());						
					}else if(resultA!=null&&resultB==null) {
						differenceAttrs.add(method.getName());
					}else {
						
						if(!(resultA instanceof List)) {
							if(!resultA.equals(resultB)) {
								String nameTrim = method.getName().substring(3);
								nameTrim = nameTrim.substring(0,1).toLowerCase()+nameTrim.substring(1);
								differenceAttrs.add(nameTrim);
							}
						}else {
							List<Object> listA = (List<Object>)resultA;
							List<Object> listB = (List<Object>)resultB;
							
							for(int i=0;i<listA.size();i++) {
								DifferenceAttr childAttr = null;
								if(i>=listB.size()) {
									 childAttr = compareValue(listA.get(i), null);
								}else {
									 childAttr = compareValue(listA.get(i), listB.get(i));
								}
								childrenDifference.add(childAttr);
							}
						}
					}
					differenceAttr.setChildrenDifference(childrenDifference);
					differenceAttr.setDifferenceAttrs(differenceAttrs);
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return differenceAttr;
	}
	//比较返回的类
	public class DifferenceAttr{
		private List<String> differenceAttrs;
		private List<DifferenceAttr> childrenDifference;
		
		public List<String> getDifferenceAttrs() {
			return differenceAttrs;
		}
		public void setDifferenceAttrs(List<String> differenceAttrs) {
			this.differenceAttrs = differenceAttrs;
		}
		public List<DifferenceAttr> getChildrenDifference() {
			return childrenDifference;
		}
		public void setChildrenDifference(List<DifferenceAttr> childrenDifference) {
			this.childrenDifference = childrenDifference;
		}
	}
	public DifferenceAttr getDifferenceAttr() {
		return differenceAttr;
	}
	public void setDifferenceAttr(DifferenceAttr differenceAttr) {
		this.differenceAttr = differenceAttr;
	}

	public static void main(String[] args) {
		ClassAttrValCompare attrCompare = new ClassAttrValCompare();
		
		ObjectTest object1 = new ObjectTest();
		object1.setMessage("这是个测试信息1");
		object1.setReturnFlag("Y");
		object1.setVisible("Y");
		object1.setNumber(1);
		
		List<ChildObject> childList1 = new ArrayList<ChildObject>();
		ChildObject child1_1 = new ChildObject();
		child1_1.setAddress("测试地址1_1");
		child1_1.setChildName("测试姓名");
		child1_1.setChildValue("测试值1_1");
		
		ChildObject child1_2 = new ChildObject();
		child1_2.setAddress("测试地址1_2");
		child1_2.setChildName("测试姓名");
		child1_2.setChildValue("测试值1_2");
		
		childList1.add(child1_1);
		childList1.add(child1_2);
		object1.setList(childList1);
		
		ObjectTest object2 = new ObjectTest();
		object2.setMessage("这是个测试信息2");
		object2.setReturnFlag("Y");
		object2.setVisible("N");
		object2.setNumber(2);
		
		List<ChildObject> childList2 = new ArrayList<ChildObject>();
		ChildObject child2_1 = new ChildObject();
		child2_1.setAddress("测试地址2_1");
		child2_1.setChildName("测试姓名");
		child2_1.setChildValue("测试值2_1");
		
		ChildObject child2_2 = new ChildObject();
		child2_2.setAddress("测试地址2_2");
		child2_2.setChildName("测试姓名");
		child2_2.setChildValue("测试值2_2");
		
		childList2.add(child2_1);
		childList2.add(child2_2);
		object2.setList(childList2);
		
		DifferenceAttr attr = attrCompare.compareValue(object1, object2);
		
		attrCompare.printTrace(attr);
		
	}
	
	public void printTrace(DifferenceAttr attr) {
		System.out.println("*******打印开始********");
		for(String str:attr.getDifferenceAttrs()) {
			System.out.println(str);
		}
		if(attr.getChildrenDifference()!=null) {
			System.out.println("********打印子节点开始*********");
			for(DifferenceAttr tempAttr:attr.getChildrenDifference()) {				
				printTrace(tempAttr);
			}
		}
	}
	
}

 2、ObjectTest类

package com.test.classreflection;

import java.util.List;

public class ObjectTest {
	
	private String message;
	private String returnFlag;
	private String visible;
	private List<ChildObject> list;
	private ChildObject childObject;
	private int number;
	
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String getReturnFlag() {
		return returnFlag;
	}
	public void setReturnFlag(String returnFlag) {
		this.returnFlag = returnFlag;
	}
	public String getVisible() {
		return visible;
	}
	public void setVisible(String visible) {
		this.visible = visible;
	}
	public List<ChildObject> getList() {
		return list;
	}
	public void setList(List<ChildObject> list) {
		this.list = list;
	}
	public ChildObject getChildObject() {
		return childObject;
	}
	public void setChildObject(ChildObject childObject) {
		this.childObject = childObject;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	
	public static void main(String[] args) {
		String[] clazzTypes = String.class.toString().split("\\.");
		System.out.println(clazzTypes[clazzTypes.length-1]);
		System.out.println(Integer.class);
		System.out.println(Object.class);
		System.out.println(ObjectTest.class);
	}
	
}

 3、ChildObject类

package com.test.classreflection;

import java.util.List;

public class ChildObject {

	private String childName;
	private String childValue;
	private String address;
	private List<ChildObject> childList;
	
	
	public String getChildName() {
		return childName;
	}
	public void setChildName(String childName) {
		this.childName = childName;
	}
	public String getChildValue() {
		return childValue;
	}
	public void setChildValue(String childValue) {
		this.childValue = childValue;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public List<ChildObject> getChildList() {
		return childList;
	}
	public void setChildList(List<ChildObject> childList) {
		this.childList = childList;
	}
}

 

 

 

 

0
0
分享到:
评论

相关推荐

    JAVA面试题最全集

    如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何...

    整理后java开发全套达内学习笔记(含练习)

    boolean (8bit,不定的)只有true和false两个值 char 16bit, 0~2^16-1 (2^16=6万6) byte 8bit, -2^7~2^7-1 (2^7=128; 注意:两个 byte 数相加,变 int 型) short 16bit, -2^15~2^15-1 (2^15=32768) int 32bit, ...

    java面试题

    84.3. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 107 84.4. 现在输入n个数字,以逗号”,”分开;然后可选择升...

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

    实例027 实现两个变量的互换(不借助 第3个变量) 37 2.3 条件语句 38 实例028 判断某一年是否为闰年 38 实例029 验证登录信息的合法性 39 实例030 为新员工分配部门 40 实例031 用Switch语句根据消费金额计算折扣 ...

    Java开发技术大全 电子版

    10.3带两个类型参数的泛型类308 10.4有界类型309 10.5通配符参数311 10.6泛型方法313 10.7泛型接口315 10.8泛型类的继承317 10.8.1以泛型类为父类317 10.8.2以非泛型类为父类319 10.8.3运行时类型识别320 ...

    net学习笔记及其他代码应用

    44.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 答:不对,有相同的hash code。 45.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 答:switch(expr1...

    大数据培训课程安排.pdf

    我今天就把成都科多⼤数据公司的培 训课程分享给⼤家,希望对学习⼤数据技术的⼩伙伴能有所帮助 上图如果看的不是很清楚,我⾃⼰做了⼀个简单介绍,⽤通俗易懂的话语讲解给各位 ps:第⼀⾄第四阶段是我将java基础...

    asp.net知识库

    通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到...

    javaSE代码实例

    1.1.1 Java的不同平台 3 1.1.2 Java发展的历程 3 1.1.3 Java的特点 4 1.2 安装开发工具包 5 1.2.1 下载JDK 5 1.2.2 安装JDK 6 1.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序...

    Spring.net框架

    t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...

    大数据工程师学习计划.pdf

    但是如果同时需要批处理和流处理,按照如上就得搭两个集群,Hadoop集群(包括HDFS+MapReduce+Yarn)和Storm集群,不易于 管理,所以出现了Spark这样的⼀站式的计算框架,既可以进⾏批处理,⼜可以进⾏流处理(实质...

Global site tag (gtag.js) - Google Analytics