java注解之运行时修改字段的注解值操作

  

今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码,

  

导入Excel是用easypoi做的,识别表头是用注解@Excel (name=" xxx ")通过这个名字来匹配

  

那你表头要动,我这个注解是硬编码

  

所以就有动态设置这个表头

        公开课JavaVo {   @Excel (name=" xxx ")   私人字符串的用户名;//省略getset方法   }      ExcelImportUtil.importExcel (file.getInputStream (), configClass (JavaVo.class),参数);   之前         

代码如下

        私有类configClass (c类字符串val) {      ?[]字段c.getDeclaredFields ();   尝试{   for (int i=0;我& lt;fields.length;我+ +){   场f=字段(我);   Excel excelAn=f.getAnnotation (Excel.class);//Excel是注解类型   如果(excelAn==null) {   继续;   }   InvocationHandler h=Proxy.getInvocationHandler (excelAn);   场hField=h.getClass () .getDeclaredField (“memberValues”);//因为这个字段事私人最终修饰,所以要打开权限   hField.setAccessible(真正的);//获取memberValues   地图memberValues=(地图)hField.get (h);//修改值属性值这里修改的是@Excel (name="姓名”)//名字是关键   memberValues。把(“名字”,val);   }   }捕捉(异常e) {   e.printStackTrace ();   }   返回c;   }      

<强> java动态修改注解的值,控制对象转化为json字符串的字段是否序列化

  

定义一个对象使用@JSONField控制该对象属性是否需要序列化

        进口com.alibaba.fastjson.annotation.JSONField;   进口lombok.Data;      @ data   公共类{   @JSONField(序列化=false)   私人字符串extendParams;      @JSONField(序列化=true)   私人字符串悲伤;   }   之前      

编写工具类

        进口com.alibaba.fastjson.annotation.JSONField;   进口java.lang.reflect.Field;   进口java.lang.reflect.InvocationHandler;   进口java.lang.reflect.Proxy;   进口java.util.Map;   进口lombok.val;/* *   *动态操作注解属性   * @since 2020年8月13日20:49:26   */公开课AnnotationUtils{/* *   *查看注解属性   * @param t   * @param名字   * @return   * @throws NoSuchFieldException   */公共对象getJSONFieldProp (T T字符串名称)抛出NoSuchFieldException {   字段字段=t.getClass () .getDeclaredField(名称);   JSONField注释=field.getAnnotation (JSONField.class);   val序列化=annotation.serialize ();   返回序列化;   }/* *   *修改注解属性   * @param t   * @param价值   * @return   * @throws NoSuchFieldException   * @throws IllegalAccessException   */公共对象setJSONFieldProp (T T字符串名称、对象值)抛出NoSuchFieldException, IllegalAccessException {   字段字段=t.getClass () .getDeclaredField(名称);   JSONField注释=field.getAnnotation (JSONField.class);   InvocationHandler InvocationHandler=Proxy.getInvocationHandler(注释);   场memberValues=invocationHandler.getClass () .getDeclaredField (“memberValues”);   memberValues.setAccessible(真正的);   地图地图=(地图)memberValues.get (invocationHandler);   map.put(“序列化”,价值);   val序列化=annotation.serialize ();   返回序列化;   }   }   之前      

测试         进口com.alibaba.fastjson.JSON;      公开课TT {      公共静态void main (String [] args)抛出NoSuchFieldException, IllegalAccessException {   AnnotationUtils,aAnnotationUtils=new AnnotationUtils<的在();   一个=new ();   a.setExtendParams (“exex”);   a.setSad (“sadsad”);      对象extendParams=aAnnotationUtils。getJSONFieldProp (“extendParams”);//查询注解的值   System.out.println (extendParams.toString ());//System.out.println (JSON.toJSONString (a));      对象extendParams1=aAnnotationUtils。setJSONFieldProp (“extendParams”,真的);//修改注解的值   System.out.println (extendParams1.toString ());   System.out.println (JSON.toJSONString (a));   }   }   之前      

去掉主要里面的注解看看效果,这个好像是发生了jvm优化导致的问题…

  

注释第一个打印打印结果如下:

        假   真正的   {“extendParams”:“exex”、“难过”:“sadsad”}         

不注释第一个打印打印结果如下:

java注解之运行时修改字段的注解值操作