java——自定义字段转译
生活随笔
收集整理的這篇文章主要介紹了
java——自定义字段转译
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
最近項目中經?;虺霈F需要對查詢數據的Date時間字段進行轉String格式化,原有項目中是對每個查詢的實體類中都添加了一個方法,專門用來進行時間格式化,感覺每個類都加,代碼維護性不高不說,關鍵還煩,所以寫了個通過字段注解的方式對需要做轉譯的字段進行轉譯操作。
主要運用的方法是java的反射,有關java反射的一些操作,可以看下我的另一篇博客java的反射特性
jar包依賴
這里引用了apach-commons-lang3,當然也可以使用其他方法進行操作,此處只是為了圖方便
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency>定義自定義注解
package com.dream.common;import java.lang.annotation.*;/*** 字段轉譯* @author YML* @date 2019/10/22 14:12*/ @Retention(RetentionPolicy.RUNTIME) //注解會在class字節碼文件中存在,在運行時可以通過反射獲取到 @Target({ElementType.FIELD}) //定義注解的作用目標作用范圍字段、枚舉的常量/方法 @Inherited //允許子類繼承父類 @Documented //說明該注解將被包含在javadoc中 public @interface FieldTrans {enum FieldTransType{/** 年月日時間格式 */DATE,/** 年月日時分秒時間格式 */DATETIME,/** 根據枚舉值轉譯 */ENUM}/** 轉譯類型 */public FieldTransType type();/** 轉譯到哪個字段,默認注解字段后面+Ch */public String transTo() default "";/** 轉譯的枚舉值 */public Class<?> enumClass() default Object.class;}定義工具類
package com.dream.util;import com.dream.common.FieldTrans; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils;import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.List;/*** @author YML* @date 2019/10/22 17:23*/ public class TransUtils {private static SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");private static SimpleDateFormat dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 對象字段轉譯* @author YML* @date 2019/10/23 9:37* @param t 轉譯對象*/public static <T> void fieldTranslate(T t) {try {//獲取字段Field[] fields = t.getClass().getDeclaredFields();//獲取父類字段Field[] superFields = t.getClass().getSuperclass().getDeclaredFields();//字段融合fields = ArrayUtils.addAll(fields, superFields);for (Field field : fields) {//設置訪問權限,以便訪問private修飾的字段屬性field.setAccessible(true);//獲取字段注解FieldTrans fieldAnnotation = field.getAnnotation(FieldTrans.class);if (null == fieldAnnotation || null == field.get(t)) {continue;}FieldTrans.FieldTransType type = fieldAnnotation.type();String transTo = StringUtils.isEmpty(fieldAnnotation.transTo()) ? field.getName() + "Ch" : fieldAnnotation.transTo();//獲取轉譯到的字段Field f = checkField(t,transTo);f.setAccessible(true);String value = getValue(type,field.get(t));//賦值f.set(t,value);}} catch (Exception e) {e.printStackTrace();}}/*** 集合轉譯* @author YML* @date 2019/10/23 9:42* @param list list*/public static <T> void listTranslate(List<T> list){list.forEach(obj->{fieldTranslate(obj);});}/*** 判斷對象是否包含某個屬性值** @param t 查詢的對象* @param containField 是否包含的屬性* @return java.lang.reflect.Field* @author YML* @date 2019/10/23 9:33*/public static <T> Field checkField(T t, String containField) throws NoSuchFieldException {try {return t.getClass().getDeclaredField(containField);} catch (NoSuchFieldException e) {e.printStackTrace();throw e;}}/*** 獲取轉譯值* @author YML* @date 2019/10/23 9:55* @param type 轉譯類型* @param trans 轉譯的對象值* @return java.lang.String*/private static String getValue(FieldTrans.FieldTransType type,Object trans){if (type == FieldTrans.FieldTransType.DATE) {return date.format(trans);}else if (type == FieldTrans.FieldTransType.DATETIME) {return dateTime.format(trans);}return null;}}測試
package com.dream.common;import com.dream.base.BaseEntity; import com.dream.util.TransUtils;import java.util.Date;/*** @author YML* @date 2019/10/23 11:34*/ public class User extends BaseEntity {private String name;private int age;@FieldTrans(type = FieldTrans.FieldTransType.DATE)private Date createTm;private String createTmCh;public String nickName;public User(String name, int age) {this.name = name;this.age = age;}public User() {}public Date getCreateTm() {return createTm;}public void setCreateTm(Date createTm) {this.createTm = createTm;}public String getCreateTmCh() {return createTmCh;}public void setCreateTmCh(String createTmCh) {this.createTmCh = createTmCh;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public static void main(String[] args) throws Exception {User user = new User();user.setName("aaa");user.setCreateTm(new Date());System.out.println("轉譯前數據:" + user.getCreateTmCh());TransUtils.fieldTranslate(user);System.out.println("轉譯后數據:" + user.getCreateTmCh());} }總結
以上是生活随笔為你收集整理的java——自定义字段转译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51单片机——交通灯
- 下一篇: 1x1px透明GIF的Base64编码