日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java——自定义字段转译

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java——自定义字段转译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近項目中經常或出現需要對查詢數據的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——自定义字段转译的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。