java注解之运行时修改字段的注解值操作
今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码,
导入Excel是用easypoi做的,识别表头是用注解@Excel(name="xxx")通过这个name来匹配
那你表头要动,我这个注解是硬编码
所以就有动态设置这个表头
publicclassJavaVo{
@Excel(name="xxx")
privateStringuserName;
//省略getset方法
}
ExcelImportUtil.importExcel(file.getInputStream(),configClass(JavaVo.class),params);
代码如下
privateClassconfigClass(Classc,Stringval){
Field[]fields=c.getDeclaredFields();
try{
for(inti=0;i
补充知识:java动态修改注解的值,控制对象转化为json字符串的字段是否序列化
定义一个对象使用@JSONField控制该对象属性是否需要序列化
importcom.alibaba.fastjson.annotation.JSONField;
importlombok.Data;
@Data
publicclassA{
@JSONField(serialize=false)
privateStringextendParams;
@JSONField(serialize=true)
privateStringsad;
}
编写工具类
importcom.alibaba.fastjson.annotation.JSONField;
importjava.lang.reflect.Field;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Proxy;
importjava.util.Map;
importlombok.val;
/**
*动态操作注解属性
*@since2020年8月13日20:49:26
*/
publicclassAnnotationUtils{
/**
*查看注解属性
*@paramt
*@paramname
*@return
*@throwsNoSuchFieldException
*/
publicObjectgetJSONFieldProp(Tt,Stringname)throwsNoSuchFieldException{
Fieldfield=t.getClass().getDeclaredField(name);
JSONFieldannotation=field.getAnnotation(JSONField.class);
valserialize=annotation.serialize();
returnserialize;
}
/**
*修改注解属性
*@paramt
*@paramvalue
*@return
*@throwsNoSuchFieldException
*@throwsIllegalAccessException
*/
publicObjectsetJSONFieldProp(Tt,Stringname,Objectvalue)throwsNoSuchFieldException,IllegalAccessException{
Fieldfield=t.getClass().getDeclaredField(name);
JSONFieldannotation=field.getAnnotation(JSONField.class);
InvocationHandlerinvocationHandler=Proxy.getInvocationHandler(annotation);
FieldmemberValues=invocationHandler.getClass().getDeclaredField("memberValues");
memberValues.setAccessible(true);
Mapmap=(Map)memberValues.get(invocationHandler);
map.put("serialize",value);
valserialize=annotation.serialize();
returnserialize;
}
}
测试
importcom.alibaba.fastjson.JSON;
publicclassTT{
publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException{
AnnotationUtilsaAnnotationUtils=newAnnotationUtils<>();
Aa=newA();
a.setExtendParams("exex");
a.setSad("sadsad");
ObjectextendParams=aAnnotationUtils.getJSONFieldProp(a,"extendParams");//查询注解的值
System.out.println(extendParams.toString());
//System.out.println(JSON.toJSONString(a));
ObjectextendParams1=aAnnotationUtils.setJSONFieldProp(a,"extendParams",true);//修改注解的值
System.out.println(extendParams1.toString());
System.out.println(JSON.toJSONString(a));
}
}
去掉main里面的注解看看效果,这个好像是发生了jvm优化导致的问题。。。
注释第一个print打印结果如下:
false
true
{"extendParams":"exex","sad":"sadsad"}
不注释第一个print打印结果如下:
false
{"sad":"sadsad"}
true
{"sad":"sadsad"}
接下来我们在做一个测试
publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException{
ListaList=newArrayList<>();
for(inti=0;i<10;i++){
AnnotationUtilsaAnnotationUtils=newAnnotationUtils<>();
Aa=newA();
a.setExtendParams("exex");
a.setSad("sadsad");
if(i%2==0){
aAnnotationUtils.setJSONFieldProp(a,"extendParams",true);//修改注解的值
}
aList.add(a);
}
System.out.println(JSON.toJSONString(aList));
}
打印结果
[{"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"}]
我本想用修改注解的方式来修改某个字段的序列化与不序列化,但是我发现注解是在class层面的并不是在对象层面。所以我的设想失败了。。
以上这篇java注解之运行时修改字段的注解值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。