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

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

作者: 壳叔 | 来源:发表于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