-
2022-02-17 12:29:43
将注解DictI18n的test()默认值改了.
1. DictI18n 注解定义如下
//在这用于测试的方法
String test() default "init";@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface DictI18n { /** * If true, the rule same as Bee config * @return */ boolean namingTransform() default false; Class<? extends BeforeReturnAnnotationHandler> handler() default AbstractDictI18nDefaultHandler.class; //在这用于测试的方法 String test() default "init"; }
2.在一个Javabean的字段majorid使用注解.可以看到注解并没有定义test()的值.
@DictI18n
private String majorid;3.从字段field中获取到注解DictI18n
然后修改test()的值.
DictI18n anno = field.getAnnotation(DictI18n.class); System.out.println("修改前, test()的值" + anno.test() + "\t"); InvocationHandler invocationHandler = Proxy.getInvocationHandler(anno); Field value = invocationHandler.getClass().getDeclaredField("memberValues"); value.setAccessible(true); Map<String, Object> memberValues = (Map<String, Object>) value.get(invocationHandler); memberValues.put("test", "changed"); System.out.println("修改后....."); System.out.println("修改后, test()的值" + anno.test() + "\t");
4. 打印结果
修改前, test()的值init 修改后..... 修改后, test()的值changed
DictI18n是ORM Bee的一个多语言国际化字典转化,全局统一设置,无需逐个设置,省时省力.
Bee,互联网新时代的Java ORM工具,更快、更简单、更自动,开发速度快,运行快,更智能!
Bee让程序员/软件工程师,从手工编码中解放出来,Bee更适合智能软件制造时代!
十分钟即可入门!
立志做最懂用户的软件!
更多相关内容 -
java注解之运行时修改字段的注解值操作
2020-08-24 20:08:05主要介绍了java注解之运行时修改字段的注解值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
Java动态修改注解值
2022-03-24 12:55:07现有这样一个需求,导出一张Excel报表,导出的实体类属性上有@ExcelProperty注解,加了该注解的属性,在导出的Excel中会显示该属性的值属于那个title。 比如 // regionName属于“区域” ...这是手动修改注解中value的现有这样一个需求,导出一张Excel报表,导出的实体类属性上有@ExcelProperty注解,加了该注解的属性,在导出的Excel中会显示该属性的值属于那个title。
比如// regionName属于“区域” @ExcelProperty(value="区域") private String regionName
// regionName属于“区域名称” @ExcelProperty(value="区域名称") private String regionName
这是手动修改注解中value的“区域”为“区域名称”,下面利用Java的“反射”实现在程序中根据业务进行动态的修改@ExcelProperty中的value值
/** * 根据导出层级,修改指定字段的注解@ExcelProperty的value值 * @param detailClass 实体类 * @param level 根据层级level修改@ExcelProperty中的value值 * @throws NoSuchFieldException * @throws IllegalAccessException */ private void dealDownloadExcelProperty(Class detailClass, int level) throws NoSuchFieldException, IllegalAccessException { Field field = detailClass.getDeclaredField("regionsName"); ExcelProperty annotation = field.getAnnotation(ExcelProperty.class); InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation); Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues"); memberValues.setAccessible(true); Map memberValuesMap = (Map) memberValues.get(invocationHandler); memberValuesMap.put("value", new String[]{downloadLevelMap.get(level)}); }
这样导出的Excel表中regionsName对应的title(@ExcelProperty的value)会动态改变
dealDownloadExcelProperty(DispatchOrderSummaryDetail.class, level); EasyExcel.write(response.getOutputStream(), DispatchOrderSummaryDetail.class).sheet("派单汇总数据").doWrite(dataList);
-
java 动态修改方法上的注解值
2018-04-15 22:35:18上篇博客提起,动态修改类上注解的值。有博友问题如果修改方法上注解值,其实二者是相通的。 代码如下: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import j...https://blog.csdn.net/jiangzeyin_/article/details/78421178
上篇博客提起,动态修改类上注解的值。有博友问题如果修改方法上注解值,其实二者是相通的。
代码如下:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by jiangzeyin on 2018/4/15. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface testA { String value(); }
import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Map; /** * Created by jiangzeyin on 2018/4/15. */ public class test { @testA("a") public static void main(String[] args) throws Exception { Method method = test.class.getMethod("main", String[].class); testA testA = method.getAnnotation(testA.class); if (testA == null) throw new RuntimeException("please add testA"); InvocationHandler invocationHandler = Proxy.getInvocationHandler(testA); Field value = invocationHandler.getClass().getDeclaredField("memberValues"); value.setAccessible(true); Map<String, Object> memberValues = (Map<String, Object>) value.get(invocationHandler); String val = (String) memberValues.get("value"); System.out.println("改变前:" + val); val = "b"; memberValues.put("value", val); System.out.println("改变后:" + testA.value()); } }
运行结果:
-
动态修改注解值
2019-10-20 22:44:41公司使用的配置中心是自研发的,暂不支持配置中心注解(如:@DynamicPropertyInject(name = "${application.effective.exchanges}"))的值采用properties文件来动态配置。这使得在同套代码的不同应用场景下,表明同...背景
平时开发业务时,由于特殊需要,使得一份代码需要部署到4个应用服务中为不同对象进行服务。公司使用的配置中心是自研发的,暂不支持配置中心注解(如:
@DynamicPropertyInject(name = "${application.effective.exchanges}")
)的值采用properties
文件来动态配置。这使得在同套代码的不同应用场景下,表明同个含义的注入就需要声明多次,且有且仅只有一个声明对于当前应用是有效的。从简洁的角度来说不适合。示例注解:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD} public @interface DynamicPropertyInject { String name() default ''; }
不能依据
properties
注入的代码情形:public class DynamicConfiguration { @DynamicPropertyInject(name = "application1.effective.name") private String application1ExchangeName; @DynamicPropertyInject(name = "application2.effective.name") private String application2ExchageName; @DynamicPropertyInject(name = "application3.effective.name") private String application3ExchangeName; }
其实在每个应用中,仅只有
application1ExchangeName
或application2ExchangeName
或application3ExchangeName
其中之一有效。能依据
properties
注入的代码情形:public class DynamicConfiguration { @DynamicPropertyInject(name = "${application.effective.name}") private String applicationExchangeName; }
解决:
针对如上所述的场景,其实要解决的是来获取
applicationExchangeName
的时候,需要根据当前的应用名称来取其对应的值。很自然的,第一反应是通过反射来获取注解属性的值并修改之。在这里提供下思路:
- 为
DynamicConfiguration
的类定义切面; - 程序执行到注解
DynamicPropertyInject
时,判断是否需要去修改值。是则修改,否则跳过。
public class DynamicConfigValueAspect { public static final String CHARACTER_DOLLAR = "$"; public static final String CHARACTER_NUMBERSIGN = "#"; @Autowired private ApplicationProperties applicationProperties; @Around("this(package of DynamicConfiguration)") public Object around(ProceedingJoinPoint pjp) throws Throwable { String methodName = pjp.getSignature().getName(); if (methodName.startsWith("get") && methodName.length() >= 4) { //提取属性名 String fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4); Field field = pjp.getTarget().getClass().getDeclaredField(fieldName); DynamicPropertyInject configuration = field.getAnnotation(DynamicPropertyInject.class); String configName = configuration.name(); //属性的DynamicPropertyInject注解值是否需要修改 if (StringUtils.isNotBlank(configName) && StringUtils.startsWith(configName, CHARACTER_DOLLAR) || StringUtils.startsWith(configName, CHARACTER_NUMBERSIGN)) { InvocationHandler invocationHandler = Proxy.getInvocationHandler(configuration); Field declaredField = invocationHandler.getClass().getDeclaredField("memberValues"); declaredField.setAccessible(true); Map memberValues = (Map) declaredField.get(invocationHandler); //获取修改的值并修改 memberValues.put("name", getApplicationPropertiesByConfigElement(configName)); } } return pjp.proceed(); } //获取修改的值 private String getApplicationPropertiesByConfigElement(String configName) throws IllegalAccessException { Field[] fields = ApplicationProperties.class.getDeclaredFields(); if (ArrayUtils.isEmpty(fields)) { return null; } for (Field field : fields) { Value annotation = field.getAnnotation(Value.class); if (Objects.nonNull(annotation) && StringUtils.equals(configName, annotation.value())) { field.setAccessible(true); return String.valueOf(field.get(applicationProperties)); } } return null; } } //application property @Configuration public class ApplicationProperties { @Value("${application.effective.name}") private String applicationEffectiveName; }
- 为
-
记一次AOP+反射动态修改注解值成功后注解没有生效
2020-12-03 11:18:02AOP+反射动态修改注解值成功后注解没有生效 最近重新看了一下反射,突发奇想,在运行的时候在不同的方法上放入不同的注解值,然后获取到注解值进行修改。于是拿了hirbernate的@Validated来玩玩。 我的想法是自定义... -
Java反射动态修改注解的值
2020-12-01 22:28:19先来看看通常情况下,我们通过反射获取注解的值的场景: 那么现在我们定义一个 @Foo 注解,它有一个类型为 String 的 value 属性,该注解应用再Field上: /** * @Author 落叶飞翔的蜗牛 * @Date 2018/3/11 * @... -
java中动态修改注解的某个属性值
2020-09-15 19:57:08这个题目我并不是很熟悉,不过根据题目描述和查阅相关Spring 创建定时任务的资料,发现这也许涉及到通过Java代码动态修改注解的属性值。 今天对此尝试了一番,发现通过反射来动态修改注解的属性值是可以做到的: ... -
Java 在运行时修改注解参数值
2020-10-25 17:14:44本文讨论如何在运行时修改注解值,我们示例使用类级别注解。 1. 注解 Java允许使用现有注解创建新的注解。最简单的注释形式是@符号后接注释名: @Override 下面创建自定义注解Greeter: @Retention(RetentionPolicy.... -
自定义注解,修改注解参数值
2020-11-17 10:31:58java中元注解有四个: @Retention @Target @Document @Inherited; @Retention:注解的保留位置 @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含 @Retention... -
Java中修改注解属性值
2018-04-20 09:12:48RibbonClient client = ConsumerApplication.class.getAnnotation(RibbonClient.class); Class[] configuration = client.configuration();...该处是修改类上的注解,至于修改方法,属性上的注解同理; -
动态修改注解(annotation)值
2021-02-28 17:24:54项目中用到了 @JsonIgnore 注解,因为类中有个详细信息, 这个详细信息在返给前端列表时用不到,只在查看详情时才会用到。所以详情字段加上了@JsonIgnore,它的默认值是true.所以在查看详情时,还要给前端返回这个... -
Java 使用动态代理来动态修改注解值
2017-11-02 09:32:17java 中定义注解都是在编写代码时,如果我们想在运行中根据某个条件来修改注解的值。是无法注解操作的,但是通过动态代理是可以实现的。这里需要用到的是Proxy 动态代理第一步得到代理实例:InvocationHandler ... -
Java 动态修改注解的属性值
2020-09-14 19:26:43以往来看,注解的属性值一般都是“硬编码”。但最近在开发过程中遇到了需要根据运行环境来设置注解属性值的需求。 举个例子: package com.das.common.util.csv; import java.lang.annotation.*; /** * @... -
Java动态修改注解的属性值
2019-06-13 19:10:01以往来看,注解的属性值一般都是“硬编码”。但最近在开发过程中遇到了需要根据运行环境来设置Retention 为 RUNTIME (运行期保留)的注解属性值的需求。举个例子: @Table(name="t1") public class Test { private... -
通过反射,动态修改注解属性值
2019-02-18 14:34:41这个题目我并不是很熟悉,不过根据题目描述和查阅相关 Spring 创建定时任务 的资料,发现这也许涉及到通过Java代码动态修改注解的属性值。 今天对此尝试了一番,发现通过反射来动态修改注解的属性值是可以做到的... -
JAVA使用变量动态修改注解属性值
2020-07-17 14:51:14JAVA使用变量动态修改注解属性值问题场景反射基础动态修改注解属性值的实现问题场景的修复 问题场景 在使用easyexcel做数据导出时,用到了注解@ExcelProperty标记表头,代码如下: import ... -
[Java] 通过反射,动态修改注解的某个属性值
2018-04-17 16:46:09这个题目我并不是很熟悉,不过根据题目描述和查阅相关 Spring 创建定时任务 的资料,发现这也许涉及到通过Java代码动态修改注解的属性值。今天对此尝试了一番,发现通过反射来动态修改注解的属性值是可以做到的:... -
java注解之运行时修改字段的注解值
2020-01-08 16:42:33导入Excel是用easypoi做的,识别表头是用注解@Excel(name = "xxx")通过这个name来匹配 那你表头要动,我这个注解是硬编码 所以就有动态设置这个表头 public classJavaVo{ @Excel(name = "xxx") private ... -
动态修改对象注解属性的值
2019-11-12 17:40:20* 动态修改对象属性上某个注解的属性值,通过getClazz()方法可以得到修改后的class * @param fieldName 对象属性名称 * @param annotationClass 注解class * @param attrName 注解属性名称 * @param attrValue ... -
Java运行时反射修改注解值
2018-11-12 16:11:30Java实现运行时修改注解值 由于java的注解不能传参,而项目中经常需要将运行中动态值传到注解中,因为需要在运行中修改注解的值,达到我们想要的目的。再次记录我项目中实现java通过反射实现运行时修改注解值。 ... -
Java 动态修改 实体类的注解值
2021-03-15 18:41:38Java 动态修改 实体类的注解值 实体类 @Data public class RsPersonalHolidayExcel { ...修改注解值 // 通过反射 获取目标实体类的目标字段 Field file= RsPersonalHolidayExcel.class.getDeclared -
记录用户的操作日志以及动态修改方法上的注解值
2018-07-21 16:40:23采用spring的AOP切面思想,对需要监控记录的方法动作设置切点(自定义注解的方式),同时利用java的反射原理实现动态修改方法上的注解值&amp;amp;amp;amp;gt; 一 AOP的基本概念 (1)Aspect(切面):通常是一... -
动态修改注解上的参数
2019-09-17 15:19:55动态修改注解上的参数 最近有一个需求,需要用自定义注解覆盖原来的注解进行入参,不过水平有限,一时间没有想到什么好办法(希望大家能给点建议 谢谢啦) 最后只能用一个本办法,在运行时对注解参数进行一个动态的... -
java正确动态修改注解属性,纠正网上说使用反射进行修改。
2019-11-15 17:59:32废话不多说,相信点进这篇博客的看客需求肯定是需要动态的使用代码进行修改注解的值,可能看了很多博客,尝试了很多方法,都没有实现。那么恭喜你,马上就可以实现了,只要你耐心的花上一点点时间看我这篇博客即可。... -
Java 反射动态获取和修改注解值
2019-12-13 11:36:11Java 反射动态获取和修改注解值Java 反射动态获取和修改注解值创建自定义注解:`TargetAnnotation.java`创建自定义注解:`Property.java`创建测试Bean:`Bean.java`测试测试结果 Java 反射动态获取和修改注解值 ... -
JAVA问题记录-利用Spring AOP来拦截特定方法上的注解并根据业务修改注解字段值
2018-03-03 23:01:02首先有块业务,需要添加埋点内容,但是此处埋点在入参值中有一个字段值,这个字段值的不同,会发送不同的打点信息(这个是在接口返回正确的情况下调用的),奔着解耦原业务和埋点的出发点,于是选择利用注解和...