Java動(dòng)態(tài)設(shè)置注解值及原理詳解
Java動(dòng)態(tài)注解值原理
描述:在運(yùn)行時(shí)根據(jù)需求更改注解中的值
一、步驟
1.定義類(lèi)
public class CadreListQueryDTO extends CadreBaseQueryDTO {
/**
* 出國(guó)事由
*/
@QueryField(field = "A21.a2114",type = QueryField.LIKE)
private String a2114;
}
2.定義方法進(jìn)行動(dòng)態(tài)設(shè)置
/**
* 動(dòng)態(tài)設(shè)置注解值
*
* @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.測(cè)試
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
- 通過(guò)反射獲取類(lèi)的注解時(shí)會(huì)通過(guò)AnnotationInvocationHandler創(chuàng)建代理對(duì)象并將數(shù)據(jù)存儲(chǔ)到memberValues里

修改memberValues里的數(shù)據(jù)

獲取結(jié)果

到此這篇關(guān)于Java動(dòng)態(tài)設(shè)置注解值及原理詳解的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)注解值原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目與Nacos配置全過(guò)程
本文介紹了如何在SpringBoot項(xiàng)目中使用Nacos作為配置中心,實(shí)現(xiàn)動(dòng)態(tài)配置管理和實(shí)時(shí)更新配置的能力,通過(guò)配置命名空間和yml文件,創(chuàng)建SpringBoot項(xiàng)目并添加Nacos依賴(lài),編寫(xiě)Controller和啟動(dòng)類(lèi),配置Tomcat啟動(dòng)程序,最終在Nacos服務(wù)端注冊(cè)成功2024-11-11
SpringBoot數(shù)據(jù)壓縮實(shí)踐方案
文章探討了Redis中處理大key的壓縮方案,包括拆分JSON結(jié)構(gòu)、使用GZIP/Deflater壓縮、優(yōu)化體積(如移除空格、縮短鍵名)、流式處理及分段存儲(chǔ),旨在降低內(nèi)存負(fù)擔(dān)并提升性能,感興趣的朋友跟隨小編一起看看吧2025-10-10
windows系統(tǒng)配置Java開(kāi)發(fā)環(huán)境變量
這篇文章主要介紹了windows系統(tǒng)配置Java開(kāi)發(fā)環(huán)境變量,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-12-12
SpringBoot分布式文件存儲(chǔ)數(shù)據(jù)庫(kù)mongod
MongoDB是一個(gè)基于分布式文件存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě),旨在為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)中功能最豐富最像關(guān)系數(shù)據(jù)庫(kù)的2023-02-02
Java日常開(kāi)發(fā)中讀寫(xiě)TXT文本舉例詳解
這篇文章主要給大家介紹了關(guān)于Java日常開(kāi)發(fā)中讀寫(xiě)TXT文本,包括使用BufferedReader、Scanner、FileInputStream等類(lèi)進(jìn)行讀取,以及使用BufferedWriter、PrintWriter、FileOutputStream等類(lèi)進(jìn)行寫(xiě)入,需要的朋友可以參考下2024-12-12

