美文网首页
[上]业务数据变动日志记录的一次需求

[上]业务数据变动日志记录的一次需求

作者: 壳叔 | 来源:发表于2019-09-20 16:17 被阅读0次
    image

    今日一问

    一个打工的,到底需要多少台电脑?
    欢迎在下方评论留言

    黑壳博客

    正文

    最近项目有个小需求,业务数据修改后要记录个日志,要记录变动的前后的值。

    需要给Bean的属性添加属性值 用于日志参数备注 例如 参数userName 在日志中记录为 用户名称

    日志示例

     某某某功能 产生变动日志内容  变动前 用户名称:李三  变动后 用户名称:李四
    

    查了一下,自己以前也没整理过类似的记录文章,这次顺便记录一下,方便新人程序员参考。

    本篇先出干货,给参数添加注解记录中文备注。数据变动对比,会在下篇文章。

    方式用Java Bean的遍历,利用Java的反射原理。Bean的属性添加属性值,使用Java的自定义注解。

    例子:

    首先创建注解类:

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SetFieldAttribute {
        String fieldName() default "";
        String fieldType() default "";
    }
    

    创建Java Bean:

        import java.util.List;
        
        public class UserBean {
            private static final long i = 1l;
        
            @SetFieldAttribute(fieldName="userId")
            private String id;
        
            @SetFieldAttribute(fieldName="userName")
            private String name;
        
            @SetFieldAttribute(fieldName="userAge")
            private String age;
        
            @SetFieldAttribute(fieldName="userEmail")
            private String email;
        
            @SetFieldAttribute(fieldName="userFavourite", fieldType="list")
            private List<String> favourite;
        
            /**
             * @return the id
             */
            @SetFieldAttribute(fieldName="userGetId")
            public String getId() {
                return id;
            }
        
            /**
             * @param id the id to set
             */
            public void setId(String id) {
                this.id = id;
            }
        
            /**
             * @return the name
             */
            @SetFieldAttribute(fieldName="userGetName")
            public String getName() {
                return name;
            }
        
            /**
             * @param name the name to set
             */
            public void setName(String name) {
                this.name = name;
            }
        
            /**
             * @return the age
             */
            @SetFieldAttribute(fieldName="userGetAge")
            public String getAge() {
                return age;
            }
        
            /**
             * @param age the age to set
             */
            public void setAge(String age) {
                this.age = age;
            }
        
            /**
             * @return the email
             */
            @SetFieldAttribute(fieldName="userGetEmail")
            public String getEmail() {
                return email;
            }
        
            /**
             * @param email the email to set
             */
            public void setEmail(String email) {
                this.email = email;
            }
        
            /**
             * @return the favourite
             */
            @SetFieldAttribute(fieldName="userGetFavourite", fieldType="list")
            public List<String> getFavourite() {
                return favourite;
            }
        
            /**
             * @param favourite the favourite to set
             */
            public void setFavourite(List<String> favourite) {
                this.favourite = favourite;
            }
        }
    

    遍历Bean 工具参考类:

     
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by kzyuan on 2019-09-05 11:28
     */
    public class BeanUtil {
        private static UserBean userBean;
    
        /**
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
            // 创建User Bean对象,并设值
            setUserBean();
            //遍历 Bean
            traversalBean();
            // 通过Bean的方法遍历 
            traversalFunction();
        }
    
        // 创建User Bean对象,并设值
        private static void setUserBean() {
            userBean = new UserBean();
            userBean.setId("1");
            userBean.setName("壳叔");
            userBean.setAge("35");
            userBean.setEmail("keshu@bhusk.com");
            List<String> favouriteList = new ArrayList<String>();
            favouriteList.add("蹦极");
            favouriteList.add("高空跳伞");
            favouriteList.add("滑雪");
            favouriteList.add("旅游");
            userBean.setFavourite(favouriteList);
        }
    
        // 遍历 Bean
        private static void traversalBean() throws Exception {
    
            // 通过Bean的属性遍历
            System.out.println("通过Bean的属性遍历");
    
            Field[] fields = userBean.getClass().getDeclaredFields();
            for (Field field : fields) {
                String mod = Modifier.toString(field.getModifiers());
                System.out.println("mod = " + mod);
                // 跳过静态属性
                if (mod.indexOf("static") != -1) {
                    continue;
                }
    
                // 取得注解的设置的属性值
                SetFieldAttribute setField = field.getAnnotation(SetFieldAttribute.class);
                if (setField != null) {
                    String fieldName = setField.fieldName();
                    String fieldType = setField.fieldType();
    
                    System.out.println("注解的属性 fieldName = " + fieldName);
                    System.out.println("注解的属性 fieldType = " + fieldType);
    
                    String getMethod = "get" + field.getName().substring(0, 1).toUpperCase()
                            + field.getName().substring(1);
                    System.out.println("User Bean 属性的Get方法名 getMethod = " + getMethod);
    
                    Class[] methodParam = null;
                    Object[] params = {};
                    Object retVal = userBean.getClass().getMethod(getMethod, methodParam).invoke(userBean, params);
    
                    if (fieldType.equals("list")) {
                        List<String> favouriteList = (List<String>) retVal;
                        int i = 1;
                        for (String favourite : favouriteList) {
                            System.out.println("User Bean 属性的值 " + field.getName() + " : " + i + " = " + favourite);
                            I++;
                        }
                    } else {
                        // 取得Bean属性的值
                        System.out.println("User Bean 属性的值 " + field.getName() + " = " + retVal);
                    }
                }
            }
    
    
        }
        private static void traversalFunction() throws Exception {
            System.out.println("通过Bean的方法遍历");
    
            // 通过Bean的方法遍历
            Method[] methods = userBean.getClass().getDeclaredMethods();
            for (Method method : methods) {
                // 取得注解的设置的属性值
                SetFieldAttribute setField = method.getAnnotation(SetFieldAttribute.class);
                if (setField != null) {
                    String fieldName = setField.fieldName();
                    String fieldType = setField.fieldType();
    
                    System.out.println("注解的属性 fieldName = " + fieldName);
                    System.out.println("注解的属性 fieldType = " + fieldType);
                    Class[] methodParam = null;
                    Object[] params = {};
                    Object retVal = null;
                    if (method.getName().substring(0, 3).equals("get")) {
                        String mod = Modifier.toString(method.getModifiers());
                        System.out.println("mod = " + mod);
                        System.out.println("User Bean 属性的Get方法名 getMethod = " + method.getName());
    
                        retVal = userBean.getClass().getMethod(method.getName(), methodParam).invoke(userBean, params);
    
                        if (fieldType.equals("list")) {
                            List<String> favouriteList = (List<String>) retVal;
                            int i = 1;
                            for (String favourite : favouriteList) {
                                System.out.println("User Bean 属性的值 " + method.getName() + " : " + i + " = " + favourite);
                                I++;
                            }
                        } else {
                            // 取得Bean属性的值
                            System.out.println("User Bean 属性的值 " + method.getName() + " = " + retVal);
                        }
                    }
                }
            }
        }
    }
    
    

    执行结果:

    通过Bean的属性遍历
    mod = private static final
    mod = private
    注解的属性 fieldName = userId
    注解的属性 fieldType = 
    User Bean 属性的Get方法名 getMethod = getId
    User Bean 属性的值 id = 1
    mod = private
    注解的属性 fieldName = userName
    注解的属性 fieldType = 
    User Bean 属性的Get方法名 getMethod = getName
    User Bean 属性的值 name = 壳叔
    mod = private
    注解的属性 fieldName = userAge
    注解的属性 fieldType = 
    User Bean 属性的Get方法名 getMethod = getAge
    User Bean 属性的值 age = 35
    mod = private
    注解的属性 fieldName = userEmail
    注解的属性 fieldType = 
    User Bean 属性的Get方法名 getMethod = getEmail
    User Bean 属性的值 email = keshu@bhusk.com
    mod = private
    注解的属性 fieldName = userFavourite
    注解的属性 fieldType = list
    User Bean 属性的Get方法名 getMethod = getFavourite
    User Bean 属性的值 favourite : 1 = 蹦极
    User Bean 属性的值 favourite : 2 = 高空跳伞
    User Bean 属性的值 favourite : 3 = 滑雪
    User Bean 属性的值 favourite : 4 = 旅游
    
    通过Bean的方法遍历
    注解的属性 fieldName = userGetName
    注解的属性 fieldType = 
    mod = public
    User Bean 属性的Get方法名 getMethod = getName
    User Bean 属性的值 getName = 壳叔
    注解的属性 fieldName = userGetId
    注解的属性 fieldType = 
    mod = public
    User Bean 属性的Get方法名 getMethod = getId
    User Bean 属性的值 getId = 1
    注解的属性 fieldName = userGetAge
    注解的属性 fieldType = 
    mod = public
    User Bean 属性的Get方法名 getMethod = getAge
    User Bean 属性的值 getAge = 35
    注解的属性 fieldName = userGetEmail
    注解的属性 fieldType = 
    mod = public
    User Bean 属性的Get方法名 getMethod = getEmail
    User Bean 属性的值 getEmail = keshu@bhusk.com
    注解的属性 fieldName = userGetFavourite
    注解的属性 fieldType = list
    mod = public
    User Bean 属性的Get方法名 getMethod = getFavourite
    User Bean 属性的值 getFavourite : 1 = 蹦极
    User Bean 属性的值 getFavourite : 2 = 高空跳伞
    User Bean 属性的值 getFavourite : 3 = 滑雪
    User Bean 属性的值 getFavourite : 4 = 旅游
    

    相关文章

      网友评论

          本文标题:[上]业务数据变动日志记录的一次需求

          本文链接:https://www.haomeiwen.com/subject/cxqsyctx.html