前言

以往来看,注解的属性值一般都是“硬编码”。但最近在开发过程中遇到了需要根据运行环境来设置 Retention 为 RUNTIME (运行期保留) 的注解属性值的需求。举个例子:

@Table(name="t1")
public class Test {private String id;...
}

对于上述类 Test,其上有一个注解 @Table,需求是这样的: 在测试环境 name 值为"t1",在其他环境 name 值为"t2"

实现方法

知识点:

  • 保留策略为 RUNTIME 的注解在运行期是保留的。
  • 出于某些技术原因,Java 虚拟机使用的“真实”注释类的实例是动态代理的实例。
  • Java 注解有一个名为 memberValues 的私有Map,其中存储了属性名称和属性值的k-v对。

基于上述知识点,可以通过反射来访问实例,然后用给定的新值替换现有值。

相关的类:

  • Proxy JDK 动态代理大佬
    可通过其 getInvocationHandler 方法获取注解的代理实例
  • InvocationHandler 调用处理器,每一个被代理的实例都有一个调用处理器
    通过反射获取被代理类的实例的属性值

示例代码:

// 根据运行环境获取表名
String tableName = getTable();
// 获取 Test 上的注解
Table annoTable = Test.class.getAnnotation(Table.class);if (annoTable == null) {throw new RuntimeException("please add @Table for Test");
}
// 获取代理处理器
InvocationHandler invocationHandler = Proxy.getInvocationHandler(annoTable);
// 获取私有 memberValues 属性
Field f = invocationHandler.getClass().getDeclaredField("memberValues");
f.setAccessible(true);
// 获取实例的属性map
Map<String, Object> memberValues = (Map<String, Object>) f.get(invocationHandler);
// 修改属性值
memberValues.put("name", tableName);

补充(获取方法的注解的值):

    public void getAnnotationValues(Object obj){//解析方法上的注解Method[] methods = obj.getClass().getDeclaredMethods();for(Method method : methods){//是否使用MyAnno注解boolean methodHasAnno = method.isAnnotationPresent(MockSwitch.class);if(methodHasAnno){//得到注解MockSwitch methodAnno = method.getAnnotation(MockSwitch.class);//输出注解属性boolean status = methodAnno.status();String mockResult = methodAnno.mockResult();System.out.println(method.getName());}}}

转载自:https://blog.csdn.net/weixin_34242509/article/details/88178897

Java动态修改注解的属性值相关推荐

  1. 记一次AOP+反射动态修改注解值成功后注解没有生效

    记一次AOP+反射动态修改注解值成功后注解没有生效 最近重新看了一下反射,突发奇想,在运行的时候在不同的方法上放入不同的注解值,然后获取到注解值进行修改.于是拿了hirbernate的@Validat ...

  2. 动态修改参数cron的值来实现Spring自带定时器动态的执行任务

    最近在做一个项目二次开发:安防系统中用到了Spring自带的定时器,本来已经实现了.但是考虑到最终会在多家保安公司上线,所以可能每家公司要求执行的定时器任务的执行周期是不会一样的,起初想着直接同意规定 ...

  3. JQuery修改对象的属性值

    JQuery修改对象的属性值 用到的便是JQuery提供的attr方法,获取属性值的基本结构为:$(obj).attr("属性名"):修改属性值的结构为:$(obj).attr(& ...

  4. Java 动态修改m3u8地址播放

    Java动态处理m3u8问题 原始m3u8文件 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:20 #EXT-X-MEDIA-SEQUENCE:0 #E ...

  5. java 动态设置 注解值_动态修改注解(annotation)值

    项目中用到了 @JsonIgnore 注解,因为类中有个详细信息, 这个详细信息在返给前端列表时用不到,只在查看详情时才会用到.所以详情字段加上了@JsonIgnore,它的默认值是true. 所以在 ...

  6. java读取properties文件并修改、新增属性值

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  7. java动态修改class_Java Agent入门学习之动态修改代码

    前言 最近用了一下午总算把Java agent给跑通了,本篇文章记录一下具体的操作步骤,以免遗忘.下面话不多说,来一起看看详细的介绍: 通过java agent可以动态修改代码(替换.修改类的定义), ...

  8. 集算报表用Java动态修改报表数据源

    实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景.常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改 ...

  9. 润乾集算报表用Java动态修改报表数据源

    实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景.常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改 ...

  10. 用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用

    public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName){try {Obje ...

最新文章

  1. linux网络编程学习笔记之三 -----多进程并发服务端
  2. amh支持java吗_AMH 6.0 发布,国内领先的云主机面板
  3. UVA - 10003 - Cutting Sticks
  4. Neo4j:使隐式关系成为显式和双向关系
  5. linux ssh禁止用户访问任何目录,怎么限制远程ssh用户访问特定的文件
  6. Transformer如何并行化? self-attention公式中的归一化有什么作用?
  7. 脚本应用实例_Selenium自动化中无头浏览器的应用
  8. 24.QTreeWidget的用法
  9. 看懂别人的代码,和自己能写代码是两回事
  10. Python读取文件找出重复元素
  11. 解决Promise.all一个被rejected,整个都被rejected的缺陷
  12. Attack Lab
  13. 前端框架介绍篇(小白专属)
  14. dlib重新训练dlib_face_recognition_resnet_model_v1.dat
  15. 天翼数字生活C++客户端实习
  16. java 银行卡支付_Java学习:用接口简单实现银行卡系统
  17. 用Adobe Reader PDF阅读器来验证电子签名有效性
  18. 凝思mysql服务器搭建_部署阿里云服务器全过程——详细篇
  19. 嵌入式系统概述1-嵌入式系统定义、特点和发展历程
  20. python3中Failed building wheel for xxx”的解决办法

热门文章

  1. 5个微信隐藏功能大揭秘(七夕表白代码)
  2. Delta对冲:实际波动率 VS 隐含波动率
  3. Shawn找到组织了!!!!!!!!
  4. 如何下载最新Windows10镜像文件(.iso文件)
  5. 深入理解C语言小括号用法
  6. 2022搜狐校园NLP算法大赛情感分析第一名方案理解和复现
  7. 数据竞赛:工业互联网算法大赛能源赛道风机轴承剩余寿命预测
  8. win10声音输出设备选择声卡步骤
  9. 国内最好的B端设计资源,都在这里了
  10. java正态分布的运用