需求
客户希望实现下面的详情操作日志功能
思路
这样 只要修改数据库的地方,比如增,删,改的地方就要保存日志记录,增加和删除好做,麻烦的就是修改,怎么弄呢,整理了下:
参考链接
参考链接:
https://blog.csdn.net/liu_ling1216/article/details/80207985
//获取属性上的注解
https://blog.csdn.net/shidebin/article/details/86593949
步骤1
前提,根据id 获取 旧的对象, 传参获取新对象
步骤2
获取2个对象 同一个属性,不同的值,
将 属性名,新值 ,旧值 放入一个 list集合中
by the way 中文名: 根据注解获取 list = [ { 'name':, 'old':'', 'new':'', comment:'' } ] list中的每个对象,最好建一张表
保存到 日志表中去
测试代码
测试实体 student.java
package com.platform.utils; import com.platform.annotation.Comment; public class Student { @Comment(value = "编号") private Integer id; @Comment(value = "姓名") private String username; @Comment(value = "年龄") private Integer age; public Student() { } public Student(Integer id, String username) { this.id = id; this.username = username; } public Student(Integer id, String username, Integer age) { this.id = id; this.username = username; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
自定义注解
/** * 注解实体 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Comment { String value() default ""; }
工具类 LogUtil.java
package com.platform.utils; import com.platform.annotation.Comment; import java.lang.reflect.Field; import java.util.*; public class LogUtil { /** * 获取两个对象同名属性内容不相同的列表 */ public static List<Map<String, Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); //获取对象的class Class<?> clazz1 = class1.getClass(); Class<?> clazz2 = class2.getClass(); //获取对象的属性列表 Field[] field1 = clazz1.getDeclaredFields(); Field[] field2 = clazz2.getDeclaredFields(); //遍历属性列表field1 for (int i = 0; i < field1.length; i++) { //遍历属性列表field2 for (int j = 0; j < field2.length; j++) { //如果field1[i]属性名与field2[j]属性名内容相同 if (field1[i].getName().equals(field2[j].getName())) { field1[i].setAccessible(true); field2[j].setAccessible(true); //如果field1[i]属性值与field2[j]属性值内容不相同 if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) { Map<String, Object> map2 = new HashMap<String, Object>(); Comment comment = field1[i].getDeclaredAnnotation(Comment.class); if(comment!=null){ map2.put("name", comment.value()); //注解名字 map2.put("old", field1[i].get(class1)); map2.put("new", field2[j].get(class2)); list.add(map2); } } break; } } } return list; } //对比两个数据是否内容相同 public static boolean compareTwo(Object object1, Object object2) { if (object1 == null && object2 == null) { return true; } //以下注掉代码,看具体需求。因有时会出现源数据是没有进行赋值,因此是null;而通过EditText获取值的时候,虽然没有值,但是会变成"",但是本质是没有赋值的。 //if (object1 == "" && object2 == null) { // return true; //} //if (object1 == null && object2 == "") { // return true; // } if (object1 == null && object2 != null) { return false; } if (object1.equals(object2)) { return true; } return false; } public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException { Student s1 = new Student(1, "张三", 29); Student s2 = new Student(2, "李四",29); List<Map<String, Object>> maps = compareTwoClass(s1, s2); for (Map<String, Object> m : maps){ System.out.println(m.get("name")+"===="+m.get("old")+"===="+m.get("new")); } } }
测试结果:
自此 测试完毕,下面就是 无脑码代码了!