Java动态设置注解值及原理详解

 更新时间:2023年11月27日 09:58:43   作者:一码评川  
这篇文章主要介绍了Java动态设置注解值及原理详解,AnnotationInvocationHandler是注解的代理hander,通过反射获取类的注解时会通过AnnotationInvocationHandler创建代理对象并将数据存储到memberValues里,需要的朋友可以参考下

Java动态注解值原理

描述:在运行时根据需求更改注解中的值

一、步骤

1.定义类

public class CadreListQueryDTO extends CadreBaseQueryDTO {

    /**
     * 出国事由
     */
    @QueryField(field = "A21.a2114",type = QueryField.LIKE)
    private String a2114;
}

2.定义方法进行动态设置

    /**
     * 动态设置注解值
     *
     * @param annotation  
     * @param valueName
     * @param value
     * @param <T>
     */
    @SneakyThrows
    public static <T extends Annotation> void setValueToAnnotate(T annotation, String valueName, Object value) {
        InvocationHandler invocationHandler = null;
        if (Objects.nonNull(annotation)) {
            invocationHandler = Proxy.getInvocationHandler(annotation);
        }
        if (Objects.isNull(invocationHandler)) {
            return;
        }
        Field nameField = invocationHandler.getClass().getDeclaredField("memberValues");
        nameField.setAccessible(true);
        Map<String, Object> memberValues = (Map<String, Object>) nameField.get(invocationHandler);
        memberValues.put(valueName, value);
    }

3.测试

 public static void main(String[] args) {
        try {
            QueryField queryField =  CadreListQueryDTO.class.getDeclaredField("a2114").getAnnotation(QueryField.class);
            System.out.println("修改前:"+ queryField.field());
            setValueToAnnotate(queryField,"field","哈哈哈哈");
            System.out.println("修改前:"+ queryField.field());
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

二、原理分析

  • AnnotationInvocationHandler是注解的代理hander
  • 通过反射获取类的注解时会通过AnnotationInvocationHandler创建代理对象并将数据存储到memberValues里

在这里插入图片描述

修改memberValues里的数据

在这里插入图片描述

获取结果

在这里插入图片描述

到此这篇关于Java动态设置注解值及原理详解的文章就介绍到这了,更多相关Java动态注解值原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot项目与Nacos配置全过程

    SpringBoot项目与Nacos配置全过程

    本文介绍了如何在SpringBoot项目中使用Nacos作为配置中心,实现动态配置管理和实时更新配置的能力,通过配置命名空间和yml文件,创建SpringBoot项目并添加Nacos依赖,编写Controller和启动类,配置Tomcat启动程序,最终在Nacos服务端注册成功
    2024-11-11
  • Java利用AQS实现自定义锁

    Java利用AQS实现自定义锁

    本文主要介绍了Java利用AQS实现自定义锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 一文带你了解Java中IO流与Guava的使用

    一文带你了解Java中IO流与Guava的使用

    Java为我们提供了非常多的操作IO的接口与类,帮助开发者实现不同源间的数据传输,比如硬盘文件、网络传输、应用调用间的数据交互与传递。今天我们来简单了解下Java中的流 以及在Guava工具包中,针对IO操作做了什么样的封装与设计
    2022-11-11
  • java 字浮串提取方法汇集

    java 字浮串提取方法汇集

    用方法toCharArray public char[] toCharArray()
    2008-10-10
  • springIoc及注解的使用实例详解

    springIoc及注解的使用实例详解

    注解(Annotation)是一种在 Java 程序中以元数据的形式对代码进行标记和说明的机制,它可以被添加到类、方法、字段、参数等程序元素上,用于提供额外的信息和指示,本文给大家介绍springIoc及注解的使用,感兴趣的朋友一起看看吧
    2024-02-02
  • SpringBoot数据压缩实践方案

    SpringBoot数据压缩实践方案

    文章探讨了Redis中处理大key的压缩方案,包括拆分JSON结构、使用GZIP/Deflater压缩、优化体积(如移除空格、缩短键名)、流式处理及分段存储,旨在降低内存负担并提升性能,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • windows系统配置Java开发环境变量

    windows系统配置Java开发环境变量

    这篇文章主要介绍了windows系统配置Java开发环境变量,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • SpringBoot分布式文件存储数据库mongod

    SpringBoot分布式文件存储数据库mongod

    MongoDB是一个基于分布式文件存储的NoSQL数据库,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富最像关系数据库的
    2023-02-02
  • 使用java生成字母验证码

    使用java生成字母验证码

    这篇文章主要介绍了使用java生成字母验证码的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Java日常开发中读写TXT文本举例详解

    Java日常开发中读写TXT文本举例详解

    这篇文章主要给大家介绍了关于Java日常开发中读写TXT文本,包括使用BufferedReader、Scanner、FileInputStream等类进行读取,以及使用BufferedWriter、PrintWriter、FileOutputStream等类进行写入,需要的朋友可以参考下
    2024-12-12

最新评论