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.


$config[zx-auto] not found$config[zx-overlay] not found