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; } }
相关推荐
Java反射机制为程序员提供了一个强大而灵活的工具箱,能够实现在编译时不知道的情况下动态地获取和操作对象。此外,动态代理技术进一步扩展了反射的应用范围,使得AOP编程模式成为可能。理解并掌握这些概念和技术...
#### 一、JAVA反射机制概述 JAVA的反射机制是一种强大的功能,允许程序在运行时获取类的信息并操作类的对象。这种能力在很多框架和库中得到了广泛应用,例如Spring框架中的AOP(Aspect Oriented Programming)特性就...
3. **类型安全的比较**:通过泛型,我们可以确保比较的两个实体是相同类型的,防止不同类型的实体之间的不匹配比较。 4. **通用的验证**:基于泛型,我们可以创建一个验证框架,对所有继承自基类的实体进行通用或...
- `char`类型可以存储一个中文字符,因为Java使用UTF-16编码,一个`char`占两个字节。 23. **Switch选择语句能否作用在String上** - 从Java 7开始,`switch`语句支持`String`作为表达式。 24. **关键字final分别...
- `equals` 方法用于比较两个对象的内容是否相等,默认情况下它也是比较引用,但许多类(如 `String`)重写了此方法以比较实际内容。 4. **`Object` 类的公共方法**: - `toString()`:返回对象的字符串表示形式...
### Java高级工程师面试总结 ...- **同一个对象的连个同步方法能否被两个线程同时调用**: - 如果这两个方法都是同步的,并且使用相同的锁对象,则不会同时被调用。 - 如果锁对象不同,则可以同时被调用。
- **==** 用来比较两个变量是否指向同一个对象。 - **equals** 方法用于判断两个对象的内容是否相等。 #### 二十八、Java关键字 - **控制流关键字:** if, else, switch, for, while, do, break, continue, return...
在Java编程中,有时我们需要处理对象的属性值,特别是字符串类型的属性,可能包含不必要的前导或尾随空格。在上述代码实例中,提供了一个名为`Test`的类,该类包含一个静态方法`beanAttributeValueTrim`,用于去除...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性、方法和构造器。类加载是Java应用程序启动时的关键过程,它将.class文件从磁盘加载到内存中,使得Java虚拟机...
- `==`操作符用于比较两个基本类型的值是否相等,或者两个引用是否指向同一个对象。 - `equals`方法用于比较两个对象的内容是否相等。它是`Object`类的一个方法,可以被重写以实现自定义的比较逻辑。 **12. 静态...
- `equals`方法用于比较两个对象的内容是否相同。 #### hashCode、identityHashCode、equals方法的区别 - `hashCode`方法返回对象的哈希码,用于散列表等数据结构。 - `identityHashCode`返回对象的身份哈希码,...
- **`equals()`**:比较两个对象的内容是否相等。 - **`hashCode()`**:用于散列查找,必须与`equals()`方法一起重写以保持一致性。 #### 值传递 - **概念**:在Java中,无论是基本数据类型还是引用类型,都是按值...
- `==`:比较两个变量是否指向同一个对象。 - `equals`:比较两个对象的内容是否相等。 **9. Hashcode的作用** 哈希码用于快速查找对象,通常与equals方法一起使用,以提高哈希表的性能。 **10. String、...
- **多态**:同一消息可以被不同类型的对象响应,提供灵活性。 - **接口**:定义行为规范,多个类可以实现同一个接口。 3. **异常处理** - 异常是程序运行时发生的错误,通过try-catch-finally语句块进行捕获和...
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, ...
- `equals`比较两个对象的内容。 - **hashCode和equals方法的区别与联系:** - `hashCode`用于散列查找,`equals`用于对象相等性的比较。 - 如果两个对象相等(`equals`),它们的哈希码也必须相同。 - **Java...
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 #### 46. String and StringBuffer的区别? - `String`是不可变的,每次修改都会创建一个新的...
- 使用 `writeObject` 和 `readObject` 方法:在类中覆盖这两个方法来自定义序列化过程。 **14. 如在COLLECTION框架中,实现比较要实现什么样的接口?** 如果要在集合框架中实现比较功能,需要实现 `Comparable` ...
- 通过不断交换相邻两个元素的位置来排序。 44. **String和StringBuffer的区别?** - `String`是不可变的,而`StringBuffer`是可变的。 - `StringBuffer`提供同步支持,适用于多线程环境。 45. **用java代码...
#### 15.2 使用Java反射机制 通过反射,可以在运行时获取类的构造函数、方法、字段等信息。 #### 15.3 反射与动态代理 动态代理利用反射生成代理对象,可以用来增强或扩展对象的功能。 ### 十四、Java标注 ####...