java注解之運行時修改字段的注解值操作
今天遇到需求:導入Excel時候列頭會發(fā)生變化,客戶是大爺要求你改代碼,
導入Excel是用easypoi做的,識別表頭是用注解@Excel(name = "xxx")通過這個name來匹配
那你表頭要動,我這個注解是硬編碼
所以就有動態(tài)設(shè)置這個表頭
public class JavaVo{ @Excel(name = "xxx") private String userName; //省略getset方法 } ExcelImportUtil.importExcel(file.getInputStream(), configClass(JavaVo.class), params);
代碼如下
private Class configClass(Class c , String val) { Field[] fields = c.getDeclaredFields(); try { for(int i = 0;i < fields.length;i++){ Field f = fields[i]; Excel excelAn = f.getAnnotation(Excel.class);//Excel是注解類型 if(excelAn == null){ continue; } InvocationHandler h = Proxy.getInvocationHandler(excelAn); Field hField = h.getClass().getDeclaredField("memberValues"); // 因為這個字段事 private final 修飾,所以要打開權(quán)限 hField.setAccessible(true); // 獲取 memberValues Map memberValues = (Map) hField.get(h); // 修改 value 屬性值 這里修改的是@Excel(name = "姓名") //name是key memberValues.put("name", val); } } catch (Exception e) { e.printStackTrace(); } return c; }
補充知識:java動態(tài)修改 注解的值,控制對象轉(zhuǎn)化為json字符串的字段是否序列化
定義一個對象使用@JSONField控制該對象屬性是否需要序列化
import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; @Data public class A { @JSONField(serialize = false) private String extendParams; @JSONField(serialize = true) private String sad; }
編寫工具類
import com.alibaba.fastjson.annotation.JSONField; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.util.Map; import lombok.val; /** * 動態(tài)操作注解屬性 * @since 2020年8月13日20:49:26 */ public class AnnotationUtils<T> { /** * 查看注解屬性 * @param t * @param name * @return * @throws NoSuchFieldException */ public Object getJSONFieldProp(T t, String name) throws NoSuchFieldException { Field field = t.getClass().getDeclaredField(name); JSONField annotation = field.getAnnotation(JSONField.class); val serialize = annotation.serialize(); return serialize; } /** * 修改注解屬性 * @param t * @param value * @return * @throws NoSuchFieldException * @throws IllegalAccessException */ public Object setJSONFieldProp(T t,String name, Object value) throws NoSuchFieldException, IllegalAccessException { Field field = t.getClass().getDeclaredField(name); JSONField annotation = field.getAnnotation(JSONField.class); InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation); Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues"); memberValues.setAccessible(true); Map map = (Map) memberValues.get(invocationHandler); map.put("serialize",value); val serialize = annotation.serialize(); return serialize; } }
測試
import com.alibaba.fastjson.JSON; public class TT { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { AnnotationUtils<A> aAnnotationUtils = new AnnotationUtils<>(); A a = new A(); a.setExtendParams("exex"); a.setSad("sadsad"); Object extendParams = aAnnotationUtils.getJSONFieldProp(a, "extendParams");//查詢注解的值 System.out.println(extendParams.toString()); // System.out.println(JSON.toJSONString(a)); Object extendParams1 = aAnnotationUtils.setJSONFieldProp(a, "extendParams", true);//修改注解的值 System.out.println(extendParams1.toString()); System.out.println(JSON.toJSONString(a)); } }
去掉main里面的注解看看效果,這個好像是發(fā)生了jvm優(yōu)化導致的問題。。。
注釋第一個print 打印結(jié)果如下:
false true {"extendParams":"exex","sad":"sadsad"}
不注釋第一個print 打印結(jié)果如下:
false {"sad":"sadsad"} true {"sad":"sadsad"}
接下來我們在做一個測試
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { List<A> aList = new ArrayList<>(); for(int i=0; i<10; i++){ AnnotationUtils<A> aAnnotationUtils = new AnnotationUtils<>(); A a = new A(); a.setExtendParams("exex"); a.setSad("sadsad"); if(i%2 == 0) { aAnnotationUtils.setJSONFieldProp(a, "extendParams", true);//修改注解的值 } aList.add(a); } System.out.println(JSON.toJSONString(aList)); }
打印結(jié)果
[{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"},{"extendParams":"exex","sad":"sadsad"}]
我本想用修改注解的方式來修改某個字段的序列化與不序列化,但是我發(fā)現(xiàn)注解是在class層面的并不是在對象層面。所以我的設(shè)想失敗了。。
以上這篇java注解之運行時修改字段的注解值操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- java注解結(jié)合aspectj AOP進行日志打印的操作
- 如何動態(tài)修改JavaBean中注解的參數(shù)值
- java使用@Scheduled注解執(zhí)行定時任務(wù)
- Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解
- java 注解默認值操作
- 解決IDEA導入javaWeb項目注解爆紅的問題
- javax.validation自定義日期范圍校驗注解操作
- 談?wù)凧ava中自定義注解及使用場景
- Java如何使用JSR303校驗數(shù)據(jù)與自定義校驗注解
- java SpringBoot自定義注解,及自定義解析器實現(xiàn)對象自動注入操作
- Java 注解學習筆記
相關(guān)文章
SpringCloud feign服務(wù)熔斷下的異常處理操作
這篇文章主要介紹了SpringCloud feign服務(wù)熔斷下的異常處理操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06spring?kafka?@KafkaListener詳解與使用過程
這篇文章主要介紹了spring-kafka?@KafkaListener詳解與使用,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02Java Builder模式實現(xiàn)原理及優(yōu)缺點解析
這篇文章主要介紹了Java Builder模式實現(xiàn)原理及優(yōu)缺點解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10用SpringBoot Admin監(jiān)控SpringBoot程序
這篇文章主要介紹了用SpringBoot Admin監(jiān)控SpringBoot程序,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10springsecurity第三方授權(quán)認證的項目實踐
Spring security 是一個強大的和高度可定制的身份驗證和訪問控制框架,本文主要介紹了springsecurity第三方授權(quán)認證的項目實踐,具有一定的參考價值,感興趣可以了解一下2023-08-08springboot 在ftl頁面上使用shiro標簽的實例代碼
這篇文章主要介紹了springboot 在ftl頁面上使用shiro標簽的實例代碼,通過文字說明結(jié)合實例的形式給大家介紹的非常詳細,需要的朋友參考下吧2018-05-05Java高性能實體類轉(zhuǎn)換工具MapStruct的使用教程詳解
MapStruct 是一個代碼生成器,它基于約定優(yōu)于配置的方法,極大地簡化了 Java bean 類型之間的映射實現(xiàn),本文主要介紹了MapStruct的具體使用以及如何進行實體類轉(zhuǎn)換,感興趣的可以了解下2024-03-03