创建对象列中文注解并通过反射读取使用

£神魔★判官ぃ 2022-05-31 02:41 210阅读 0赞

业务需求:需要记录修改前后具体的改变数据,为获取列的中文描述,以存入日志方便显示到前台上,需要创建自定义注解
1.自定义注解类:

  1. import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) //运行时保留 @Target({ElementType.FIELD}) //注解使用在字段上 @Documented //JAVADOC public @interface DataName { /** * 字段名称 * @return */ String name() default ""; }

2.编写反射方法,进行前后比较:

  1. /** * 获取两个对象同名属性内容不相同的列表 * @param class1 old对象 * @param class2 new对象 * @return * @throws ClassNotFoundException * @throws IllegalAccessException */
  2. public static List<Map<String ,Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException {
  3. List<Map<String,Object>> list=new ArrayList<Map<String, Object>>();
  4. //获取对象的class
  5. Class<?> clazz1 = class1.getClass();
  6. Class<?> clazz2 = class2.getClass();
  7. //获取对象的属性列表
  8. Field[] field1 = clazz1.getDeclaredFields();
  9. Field[] field2 = clazz2.getDeclaredFields();
  10. StringBuilder sb=new StringBuilder();
  11. //遍历属性列表field1
  12. for(int i=0;i<field1.length;i++) {
  13. //遍历属性列表field2
  14. for (int j = 0; j < field2.length; j++) {
  15. //如果field1[i]属性名与field2[j]属性名内容相同
  16. if (field1[i].getName().equals(field2[j].getName())) {
  17. if (field1[i].getName().equals(field2[j].getName())) {
  18. field1[i].setAccessible(true);
  19. field2[j].setAccessible(true);
  20. //如果field1[i]属性值与field2[j]属性值内容不相同
  21. if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
  22. Map<String, Object> map2 = new HashMap<String, Object>();
  23. DataName name=field1[i].getAnnotation(DataName.class);
  24. String fieldName="";
  25. if(name!=null){
  26. fieldName=name.name();
  27. }else {
  28. fieldName=field1[i].getName();
  29. }
  30. map2.put("name", fieldName);
  31. map2.put("old", field1[i].get(class1));
  32. map2.put("new", field2[j].get(class2));
  33. list.add(map2);
  34. }
  35. break;
  36. }
  37. }
  38. }
  39. }
  40. return list;
  41. }
  42. /** * 对比两个数据是否内容相同 * * @param object1,object2 * @return boolean类型 */
  43. public static boolean compareTwo(Object object1,Object object2){
  44. if(object1==null&&object2==null){
  45. return true;
  46. }
  47. if(object1==null&&object2!=null){
  48. return false;
  49. }
  50. if(object1.equals(object2)){
  51. return true;
  52. }
  53. return false;
  54. }

3.(额外)将注解添加到生成模板上,直接生成:

  1. @TableName("${tableName}")
  2. public class ${className} extends Model<${className}> {
  3. private static final long serialVersionUID=1L;
  4. #foreach ($column in $columns)
  5. #if($column.columnName == $pk.columnName)
  6. //$column.comments
  7. @TableId(value="id", type= IdType.AUTO)
  8. #if($column.comments)
  9. @DataName(name="$column.comments")
  10. #end
  11. private $column.attrType $column.attrname;
  12. #elseif($column.columnName == "delete_flag")
  13. @TableField("$column.columnName")
  14. @TableLogic
  15. #if($column.comments)
  16. @DataName(name="$column.comments")
  17. #end
  18. private $column.attrType $column.attrname;
  19. #else
  20. //$column.comments
  21. @TableField("$column.columnName")
  22. #if($column.comments)
  23. @DataName(name="$column.comments")
  24. #end
  25. private $column.attrType $column.attrname;
  26. #end

发表评论

表情:
评论列表 (有 0 条评论,210人围观)

还没有评论,来说两句吧...

相关阅读