今天遇到需求:导入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注解之运行时修改字段的注解值操作