Zmena parametrov anotácie za behu programu
1. Prehľad
Anotácie , forma metadát, ktoré môžete pridať do kódu Java. Títo anotácie môžu byť spracované v čase kompilácie a vložené do súborov triedy alebo môžu byť uchovávané a prístupné za behu programu pomocou Odraz .
V tomto článku si rozoberieme, ako zmeniť anotácia hodnota za behu pomocou Odraz. Pre tento príklad použijeme anotáciu na úrovni triedy.
2. Anotácia
Java umožňuje vytváranie nových anotácie pomocou existujúcich. V najjednoduchšej forme je anotácia predstavovaná ako @ symbol nasledovaný názvom anotácie:
@ Override
Vytvorme si vlastnú anotáciu Zdravší:
@Retention (RetentionPolicy.RUNTIME) public @interface Greeter {public String greet () default ""; }
Teraz budeme vytvárať triedu Java Zdravím vás ktorý používa úroveň triedy anotácia :
@Greeter (greet = "Dobré ráno"), pozdrav vo verejnej triede {}
Teraz pristúpime k hodnote anotácie pomocou odrazu. Trieda Java Trieda poskytuje metódu getAnnotation prístup k anotáciám triedy:
Zdravší pozdravy = Greetings.class.getAnnotation (Greeter.class); System.out.println ("Ahoj," + greetings.greet () + "!!");
3. Zmeniť anotáciu
Trieda Java Trieda udržuje mapu pre správu anotácií - Anotácia triedy ako kľúče a Anotácia objekt ako hodnota:
Mapa mapa;
Túto mapu aktualizujeme, aby sme zmenili anotáciu za behu programu. Prístup k tejto mape sa líši v rôznych implementáciách JDK. Budeme o tom diskutovať pre JDK7 a JDK8.
3.1.Implementácia JDK 7
Trieda Java Trieda má pole anotácie. Pretože sa jedná o súkromné pole, pre prístup k nemu musíme nastaviť dostupnosť poľa na pravda. Java poskytuje metódu getDeclaredField pre prístup do ľubovoľného poľa podľa jeho názvu:
Anotácie poľa = Class.class.getDeclaredField (ANOTÁCIE); annotations.setAccessible (true);
Teraz získajme prístup k anotačnej mape pre triedu Zdravší:
Mapa map = annotations.get (targetClass);
Toto je mapa, ktorá obsahuje informácie o všetkých anotáciách a ich hodnotových objektoch. Chceme to zmeniť Zdravší hodnotu anotácie, ktorú môžeme dosiahnuť aktualizáciou anotačného objektu z Zdravší trieda:
map.put (targetAnnotation, targetValue);
3.2.Implementácia JDK 8
Obchody s implementáciami Java 8 anotácie informácie v triede AnnotationData . K tomuto objektu môžeme získať prístup pomocou annotationData metóda. Nastavíme prístupnosť pre annotationData metóda do pravda pretože je to súkromná metóda:
Metóda method = Class.class.getDeclaredMethod (ANNOTATION_METHOD, null); method.setAccessible (true);
Teraz máme prístup anotácie lúka. Pretože toto pole je zároveň súkromným poľom, nastavíme prístupnosť na pravda:
Anotácie poľa = annotationData.getClass (). GetDeclaredField (ANNOTATIONS); annotations.setAccessible (true);
Toto pole má mapu vyrovnávacej pamäte anotácií, ktorá ukladá triedu anotácií a hodnotový objekt. Poďme to zmeniť:
Mapa map = annotations.get (annotationData); map.put (targetAnnotation, targetValue);
4. Aplikácia
Zoberme si tento príklad:
Zdravší pozdravy = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Ahoj," + greetings.greet () + "!!");
Toto bude pozdrav „Dobré ráno“, pretože to je hodnota, ktorú sme poskytli anotácii.
Teraz vytvoríme ďalší objekt z Zdravší typ s hodnotou „Dobrý večer“:
Greeter targetValue = nový DynamicGreeter ("Dobrý večer");
Aktualizujme mapu anotácií o novú hodnotu:
alterAnnotationValueJDK8 (Greetings.class, Greeter.class, targetValue);
Znova skontrolujte hodnotu pozdravu:
pozdravy = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Ahoj," + greetings.greet () + "!!");
Bude pozdravený ako „Dobrý večer“.
5. Záver
Implementácie Java používajú na ukladanie údajov anotácií dve dátové polia: anotácie, vyhlásené poznámky. Rozdiel medzi týmito dvoma: najprv ukladať anotácie z nadradených tried a neskôr jeden ukladať iba pre aktuálnu triedu.
Keďže implementácia getAnnotation sa líši v JDK 7 a JDK 8, ktoré tu používame anotácie poľná mapa pre jednoduchosť.
A ako vždy, zdrojový kód implementácie je k dispozícii na stránkach Github.