最近在做一个项目中需要实现一个产品的升级中的变更记录查看,写了一个反射方法来记录对象中不同的字段内容,记录下来以备后来参考。
public List<ChangeInfo>compareDetails(Object obj){ //存放新旧对象改变的内容 List<ChangeInfo> list = new ArrayList<ChangeInfo>(); //新的对象 Object newVersion = obj; //旧的对象 Object oldVersion = XXXService.get(newVersion.getLastVersionId()); //需要比较的字段 String[]opDiffNameArray={"XX编码","XX名称","XX要求","XX目的","XX范围","XX使用前","XX使用过程中","XX使用过程后","XX注意事项"}; //对应的类中的成员变量 String[]opDiffArray={"code","name","requirement","purpose","range","beforeUse","inUse","afterUse","notice"}; contrastObj(newVersion, oldVersion, opDiffArray, opDiffNameArray, list); return list; } public void contrastObj(Object pojo1, Object pojo2, String[] diffMemberArray, String[] diffMemberName, List<ChangeInfo> diffList) { Map<String, Object> diffMap = new HashMap<String, Object>(); //map存储中英文对应 for (int i = 0; i < diffMemberArray.length; i++) { diffMap.put(diffMemberArray[i], diffMemberName[i]); } //英文List List<String> diffMember = Arrays.asList(diffMemberArray); try { Class clazz = pojo1.getClass(); //获取obj1的所有字段 Field[] fields = pojo1.getClass().getDeclaredFields(); //遍历obj1所有字段 for (Field field : fields) { //如果该字段不再Map中遍历下一个字段 if (!diffMember.contains(field.getName())) { continue; } //利用反射获取对应字段的get,set方法 PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); //获取get方法 Method getMethod = pd.getReadMethod(); Object o1 = null; Object o2 = null; if (pojo1 != null) { //调用obj1的对应字段的get方法 o1 = getMethod.invoke(pojo1); } if (pojo2 != null) { //调用obj2的对应字段的get方法 o2 = getMethod.invoke(pojo2); } String str1 = ""; String str2 = ""; //如果对象是日期类型格式化 if (o1 instanceof Date) { str1 = new SimpleDateFormat("yyyy-MM-dd").format(o1); str2 = new SimpleDateFormat("yyyy-MM-dd").format(o2); } else if (o1 instanceof String) { str1 = (String) o1; str2 = (String) o2; } else { continue; } //判断返回的对象不相等 if ((str1 != null && !str1.equals(str2)) || (str2 != null && !str2.equals(str1))) { ChangeInfo change = new ChangeInfo(); //字段英文名称 change.setTitle(field.getName()); //中文名称 change.setName((String) diffMap.get(field.getName())); //旧信息 change.setOldInfo(str2); //新信息 change.setNewInfo(str1); diffList.add(change); } } } catch (Exception e) { e.printStackTrace(); } } //存放不同信息的类 public class ChangeInfo extends DataEntity<ChangeInfo> { private static final long serialVersionUID = 1L; private String title; // 改变标题 (变量名) private String name; // 变更项的名称 (中文名) private String type; // 变更显示类型(1:显示content内容 2: 显示前后(oldInfo,newInfo)变更信息) private String content; // 提示内容 private String oldInfo; // 之前内容 private String newInfo; // 之后内容 }