本文由黑壳博客原创
本文来源[上]业务数据变动日志记录的一次需求
今日一问
一个打工的,到底需要多少台电脑?
欢迎在下方评论留言
正文
最近项目有个小需求,业务数据修改后要记录个日志,要记录变动的前后的值。
需要给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.comE-mail:keshu@bhusk.com
本文由 黑壳博客的壳叔 创作或转载,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章