当前位置: 首页 > news >正文

java反射:动态修改注解上属性的值

        需求:使用easypoi导出时,根据当前时间设置对应的表头信息,因为表头是通过@Excel注解中的属性进行,所以需要动态设置注解中的属性值。工具类代码如下:

package com.zkdj.common.utils.poi;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Map;/*** 类描述 -> 动态设置注解中的属性值** @Author: ywz* @Date: 2024/09/05*/
public class DynamicSetAnnotationValue {protected static final Logger logger = LoggerFactory.getLogger(DynamicSetAnnotationValue.class);/*** 方法描述 -> 变更注解的属性值** @param clazz     注解所在的实体类* @param tClass    注解类* @param filedName 要修改的注解属性名* @param value     要设置的属性值* @Author: ywz* @Date: 2024/09/05*/public static <A extends Annotation> Class<?> changeAnnotationValue(Class<?> clazz, Class<A> tClass, String filedName, Object value) {try {// 获取类中的所有属性Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 判断属性是否有指定注解A annotation = field.getAnnotation(tClass);if (annotation != null) {setAnnotationValue(annotation, filedName, value);}}} catch (Exception e) {logger.error("动态设置注解属性值失败");}return clazz;}/*** 方法描述 -> 动态设置注解的属性值, 通过指定的其他属性名和对应的值来设置** @param clazz          注解所在的实体类* @param tClass         注解类* @param assignProperty 指定的属性名* @param assignValues    指定的属性值(可以对多个不同的值进行设置)* @param filedName      要修改的注解属性名* @param value          要设置的属性值* @Author: ywz* @Date: 2024/09/05*/public static <A extends Annotation> Class<?> changeAnnotationValueByAssignProperty(Class<?> clazz, Class<A> tClass, String assignProperty, List<String> assignValues, String filedName, Object value) {try {// 获取类中的所有属性Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 判断属性是否有指定注解A annotation = field.getAnnotation(tClass);if (annotation != null) {String annotationValue = (String) getAnnotationValue(annotation, assignProperty);assignValues.forEach(assignValue -> {// 判断是否是要设置属性值的注解if (annotationValue.equals(assignValue)) {try {setAnnotationValue(annotation, filedName, value);} catch (NoSuchFieldException | IllegalAccessException e) {throw new RuntimeException(e);}}});}}} catch (Exception e) {logger.error("动态设置注解属性值失败");}return clazz;}/*** 方法描述 -> 设置注解中的字段值** @param annotation 要修改的注解实例* @param fieldName  要修改的注解属性名* @param value      要设置的属性值* @Author: ywz* @Date: 2024/09/05*/private static void setAnnotationValue(Annotation annotation, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {InvocationHandler handler = Proxy.getInvocationHandler(annotation);Field field = handler.getClass().getDeclaredField("memberValues");field.setAccessible(true);Map memberValues = (Map) field.get(handler);memberValues.put(fieldName, value);}/*** 方法描述 -> 获取注解中的属性值** @param annotation 要获取的注解实例* @param fieldName 要获取的注解属性名* @Author: ywz* @Date: 2024/09/05*/private static Object getAnnotationValue(Annotation annotation, String fieldName) throws NoSuchFieldException, IllegalAccessException {InvocationHandler handler = Proxy.getInvocationHandler(annotation);Field field = handler.getClass().getDeclaredField("memberValues");field.setAccessible(true);Map memberValues = (Map) field.get(handler);return memberValues.get(fieldName);}}

         使用案例:导出时将第14到19列的groupName(合并单元格内容)设置为当前年份。

        Class<?> exprotClass = DynamicSetAnnotationValue.changeAnnotationValueByAssignProperty(lastYearExprotClass, Excel.class, "orderNum", Arrays.asList("14", "15", "16", "17", "18", "19"), "groupName", calendar.get(Calendar.YEAR) + "年");

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java 实现的单例,在static块中实例化是否会有线程安全问题?
  • golang闭包中变量获取
  • pyro.optim pyro ppl 概率编程 优化器 pytorch
  • 食品安全管理员考试真题题库及答案
  • Python爬虫—教你用Python爬取小说,小白也能操作(附源码)
  • 【C++ Primer Plus习题】10.4
  • 量子运算-计算新时代的开端
  • Java健康养老智慧相伴养老护理小程序系统源码代办陪诊陪护更安心
  • Nginx: 性能优化之提升CPU效率以及TCP的三次握手和四次挥手
  • Linux 初次创建分区及磁盘挂载
  • SPEC CPU2017的runcpu命令使用
  • 【Java】将 Java 代码打包成 Jar 包
  • Etl加工建模方式分类使用
  • 智能制造新纪元:3D协同平台引领前沿创新
  • Python【3】乌七八糟
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【技术性】Search知识
  • Babel配置的不完全指南
  • C学习-枚举(九)
  • es6
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • java 多线程基础, 我觉得还是有必要看看的
  • Javascript编码规范
  • Java比较器对数组,集合排序
  • MQ框架的比较
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • React-redux的原理以及使用
  • 记一次和乔布斯合作最难忘的经历
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 漂亮刷新控件-iOS
  • 前嗅ForeSpider采集配置界面介绍
  • 强力优化Rancher k8s中国区的使用体验
  • 设计模式 开闭原则
  • 学习JavaScript数据结构与算法 — 树
  • 用 Swift 编写面向协议的视图
  • 用jquery写贪吃蛇
  • 正则表达式
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (笔记)M1使用hombrew安装qemu
  • (附源码)ssm高校实验室 毕业设计 800008
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Oracle存储过程编写经验和优化措施
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 简单实现MD5
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件