色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

java注解之運(yùn)行時(shí)修改字段的注解值操作

瀏覽:70日期:2022-08-26 11:45:11

今天遇到需求:導(dǎo)入Excel時(shí)候列頭會發(fā)生變化,客戶是大爺要求你改代碼,

導(dǎo)入Excel是用easypoi做的,識別表頭是用注解@Excel(name = 'xxx')通過這個(gè)name來匹配

那你表頭要動,我這個(gè)注解是硬編碼

所以就有動態(tài)設(shè)置這個(gè)表頭

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'); // 因?yàn)檫@個(gè)字段事 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; }

補(bǔ)充知識:java動態(tài)修改 注解的值,控制對象轉(zhuǎn)化為json字符串的字段是否序列化

定義一個(gè)對象使用@JSONField控制該對象屬性是否需要序列化

import com.alibaba.fastjson.annotation.JSONField;import lombok.Data;@Datapublic 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里面的注解看看效果,這個(gè)好像是發(fā)生了jvm優(yōu)化導(dǎo)致的問題。。。

注釋第一個(gè)print 打印結(jié)果如下:

falsetrue{'extendParams':'exex','sad':'sadsad'}

不注釋第一個(gè)print 打印結(jié)果如下:

false{'sad':'sadsad'}true{'sad':'sadsad'}

接下來我們在做一個(gè)測試

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'}]

我本想用修改注解的方式來修改某個(gè)字段的序列化與不序列化,但是我發(fā)現(xiàn)注解是在class層面的并不是在對象層面。所以我的設(shè)想失敗了。。

以上這篇java注解之運(yùn)行時(shí)修改字段的注解值操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 999国产精品亚洲77777 | 欧美国产大片 | 久久久久久久91精品免费观看 | 亚洲高清中文字幕一区二区三区 | 日韩毛片免费线上观看 | 久久久久999 | 7777在线视频 | 一级啊片 | 久久一本精品 | 亚洲国产综合久久精品 | 一级网站片| 日本毛片免费看 | 亚洲国产一区二区三区最新 | 中文字幕波多野不卡一区 | 日本欧美一级aaaaa毛片 | 精品视频一区二区三区免费 | 亚洲国产日产韩国欧美综合 | 亚洲成年男人的天堂网 | 国产一区二区播放 | 一级毛片免费播放视频 | 亚洲影院国产 | 99久热在线精品视频播 | 99亚洲精品视频 | 一级毛片成人午夜 | 久久综合丁香 | 怡红院免费的全部视频国产a | 国产亚洲人成网站观看 | 精品久久香蕉国产线看观看亚洲 | 国产精品极品 | 黄a在线观看| 97青娱国产盛宴精品视频 | 7m视频精品凹凸在线播放 | 国产综合在线观看视频 | 手机在线看片国产日韩生活片 | 清纯偷拍精品视频在线观看 | 久久亚洲精品中文字幕亚瑟 | 69精品免费视频 | 麻豆国产96在线 | 中国 | 91精品国产综合久久青草 | 国产精品外围在线观看 | 一级做a爰片久久毛片潮喷 一级做a爰片久久毛片美女 |