Java动态修改注解的属性值
前言
以往来看,注解的属性值一般都是“硬编码”。但最近在开发过程中遇到了需要根据运行环境来设置 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动态修改注解的属性值相关推荐
- 记一次AOP+反射动态修改注解值成功后注解没有生效
记一次AOP+反射动态修改注解值成功后注解没有生效 最近重新看了一下反射,突发奇想,在运行的时候在不同的方法上放入不同的注解值,然后获取到注解值进行修改.于是拿了hirbernate的@Validat ...
- 动态修改参数cron的值来实现Spring自带定时器动态的执行任务
最近在做一个项目二次开发:安防系统中用到了Spring自带的定时器,本来已经实现了.但是考虑到最终会在多家保安公司上线,所以可能每家公司要求执行的定时器任务的执行周期是不会一样的,起初想着直接同意规定 ...
- JQuery修改对象的属性值
JQuery修改对象的属性值 用到的便是JQuery提供的attr方法,获取属性值的基本结构为:$(obj).attr("属性名"):修改属性值的结构为:$(obj).attr(& ...
- Java 动态修改m3u8地址播放
Java动态处理m3u8问题 原始m3u8文件 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:20 #EXT-X-MEDIA-SEQUENCE:0 #E ...
- java 动态设置 注解值_动态修改注解(annotation)值
项目中用到了 @JsonIgnore 注解,因为类中有个详细信息, 这个详细信息在返给前端列表时用不到,只在查看详情时才会用到.所以详情字段加上了@JsonIgnore,它的默认值是true. 所以在 ...
- java读取properties文件并修改、新增属性值
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- java动态修改class_Java Agent入门学习之动态修改代码
前言 最近用了一下午总算把Java agent给跑通了,本篇文章记录一下具体的操作步骤,以免遗忘.下面话不多说,来一起看看详细的介绍: 通过java agent可以动态修改代码(替换.修改类的定义), ...
- 集算报表用Java动态修改报表数据源
实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景.常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改 ...
- 润乾集算报表用Java动态修改报表数据源
实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景.常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改 ...
- 用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用
public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName){try {Obje ...
最新文章
- linux网络编程学习笔记之三 -----多进程并发服务端
- amh支持java吗_AMH 6.0 发布,国内领先的云主机面板
- UVA - 10003 - Cutting Sticks
- Neo4j:使隐式关系成为显式和双向关系
- linux ssh禁止用户访问任何目录,怎么限制远程ssh用户访问特定的文件
- Transformer如何并行化? self-attention公式中的归一化有什么作用?
- 脚本应用实例_Selenium自动化中无头浏览器的应用
- 24.QTreeWidget的用法
- 看懂别人的代码,和自己能写代码是两回事
- Python读取文件找出重复元素
- 解决Promise.all一个被rejected,整个都被rejected的缺陷
- Attack Lab
- 前端框架介绍篇(小白专属)
- dlib重新训练dlib_face_recognition_resnet_model_v1.dat
- 天翼数字生活C++客户端实习
- java 银行卡支付_Java学习:用接口简单实现银行卡系统
- 用Adobe Reader PDF阅读器来验证电子签名有效性
- 凝思mysql服务器搭建_部署阿里云服务器全过程——详细篇
- 嵌入式系统概述1-嵌入式系统定义、特点和发展历程
- python3中Failed building wheel for xxx”的解决办法