java只修改变的字段_java注解之运行时修改字段的注解值操作
今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码,
导入Excel是用easypoi做的,识别表头是用注解@Excel(name = "xxx")通过这个name来匹配
那你表头要动,我这个注解是硬编码
所以就有动态设置这个表头
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 修饰,所以要打开权限
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动态修改 注解的值,控制对象转化为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;
/**
* 动态操作注解属性
* @since 2020年8月13日20:49:26
*/
public class AnnotationUtils {
/**
* 查看注解属性
* @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 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里面的注解看看效果,这个好像是发生了jvm优化导致的问题。。。
注释第一个print 打印结果如下:
false
true
{"extendParams":"exex","sad":"sadsad"}
不注释第一个print 打印结果如下:
false
{"sad":"sadsad"}
true
{"sad":"sadsad"}
接下来我们在做一个测试
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
List aList = new ArrayList<>();
for(int i=0; i<10; i++){
AnnotationUtils 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));
}
打印结果
[{"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注解之运行时修改字段的注解值操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。
java只修改变的字段_java注解之运行时修改字段的注解值操作相关推荐
- java通过注解修改字段名_java注解之运行时修改字段的注解值操作
java注解之运行时修改字段的注解值操作,注解,字段,表头,属性,对象 java注解之运行时修改字段的注解值操作 易采站长站,站长之家为您整理了java注解之运行时修改字段的注解值操作的相关内容. 今 ...
- java注解之运行时修改字段的注解值
今天遇到需求:导入Excel时候列头会发生变化,客户是大爷要求你改代码, 导入Excel是用easypoi做的,识别表头是用注解@Excel(name = "xxx")通过这个na ...
- java 注解 runtime_自定义注解之运行时注解(RetentionPolicy.RUNTIME)
对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成clas ...
- OpenRasp Java运行时修改字节码技术
Java运行时修改字节码技术 Java运行时动态修改字节码技术,常用的有javassist asm来实现.不过最近在分析openrasp-java这块时,程序使用的javassist来动态插桩关键类, ...
- Java反射运行时_java反射获得运行时属性的值
运行时动态获得属性的值(通过方法获得): Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { if ...
- ASP.NET Core 网站运行时修改设置如何自动生效
点击蓝字 关注我 在ASP.NET Core中,如果修改了appsettings.json中的设置,那么默认情况下就得重启网站才能生效.有没有办法在修改设置后自动刷新并应用呢? 背景 首先,我们看看默 ...
- Unity——在运行时修改Animator Controller状态机中的动画片段
在开发中,经常会有在运行时根据对象的不同状态来修改播放动画的需求.比如做一个射击游戏,那么持手枪时.攻击使用的动画片段明显是不能与持匕首时相同的. 原先用Legacy Animation时,是可以很方 ...
- .net报表控件ActiveReports教程:运行时修改数据(附源码)
ActiveReports 是一款专注于 .NET 和 .NET Core 平台的报表控件.通过拖拽式报表设计器,可以快速地设计 Excel表格.Word文档.图表.数据过滤.数据钻取.精准套打等类型 ...
- java运行时_java编译时与运行时概念与实例详解
Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只 ...
最新文章
- MindSpore模型精度调优实践
- java struts技术_java技术框架之:struts
- windows2003sp2安装sql2005出错解决方法
- my understanding for love
- 用了Redis里面的map和set
- Oracle中 drop user 和 drop user cascade 的区别
- tomcat源码分析_CVE-2020-9484 tomcat session反序列化漏洞分析
- .Net中的RealProxy实现AOP
- PostgreSQL 11.2 手册 (中文版) PostgreSQL中文社区
- python re提取中文
- general error c101008a: Failed to save the updated manifest to the file .\D
- 实验四+126+黄晟
- java——Java环境搭建:JDK安装、常用命令
- 转换TIFF图像为JPEG2000格式
- Intellij-IDEA(2017)破解
- 嵌入式Linux C编程学习之路(八)——read/write,lseek函数,cp指令的代码实现
- php版葫芦侠签到,葫芦侠三楼一键签到工具
- Java编程高手教你写出完美代码
- windows命令将 txt 文本转换称 excel
- can总线短距离不用双绞线_电磁干扰很严重,如何提高CAN总线电磁兼容性
热门文章
- AWS在深圳成立大中华区第二个物联网实验室
- Spring精华问答 | Spring Boot有哪些优点?
- mapreduce原理_Hbase Bulkload 原理面试必备
- ETL异构数据源Datax_日期增量同步_13
- idea 个性化定制快捷键
- 企业实战(Jenkins+GitLab+SonarQube)_03_Jenkins登录
- vue的transition组件的使用
- Integer缓存池
- adb-获取包名/界面名、获取app启动时间、卸载app、退出app、查看所有进程
- android 端口进程号,Android中如何根据端口号寻找对应的进程