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; } }
相关推荐
如何取小数点前两位,并四舍五入。 4.日期和时间 如何取得年月日,小时分秒 如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何...
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, ...
84.3. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 107 84.4. 现在输入n个数字,以逗号”,”分开;然后可选择升...
实例027 实现两个变量的互换(不借助 第3个变量) 37 2.3 条件语句 38 实例028 判断某一年是否为闰年 38 实例029 验证登录信息的合法性 39 实例030 为新员工分配部门 40 实例031 用Switch语句根据消费金额计算折扣 ...
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 ...
44.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 答:不对,有相同的hash code。 45.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? 答:switch(expr1...
我今天就把成都科多⼤数据公司的培 训课程分享给⼤家,希望对学习⼤数据技术的⼩伙伴能有所帮助 上图如果看的不是很清楚,我⾃⼰做了⼀个简单介绍,⽤通俗易懂的话语讲解给各位 ps:第⼀⾄第四阶段是我将java基础...
通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到...
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程序...
t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...
但是如果同时需要批处理和流处理,按照如上就得搭两个集群,Hadoop集群(包括HDFS+MapReduce+Yarn)和Storm集群,不易于 管理,所以出现了Spark这样的⼀站式的计算框架,既可以进⾏批处理,⼜可以进⾏流处理(实质...