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

本文由黑壳博客原创

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

今日一问

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

黑壳博客

正文

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

需要给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 = 旅游

About

欢迎在评论写下你的程序员趣事~~

欢迎加入我们的小组织 ,大家都叫壳叔,期待你的到来。

欢迎关注公众号

黑壳博客微信公众号

这是我们的Group

黑壳家根据地 Q群:200408242

黑壳博客 blog.bhusk.com

E-mail:keshu@bhusk.com

本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。

可自由转载、引用,但需署名作者且注明文章

留下你的脚步
推荐阅读