Promjena parametara bilješki tijekom izvođenja

1. Pregled

Bilješke , oblik metapodataka koji možete dodati Java kodu. Ovi bilješke može se obraditi u vrijeme kompajliranja i ugraditi u datoteke klase ili se može zadržati i pristupiti im tijekom izvođenja pomoću Odraz .

U ovom ćemo članku razgovarati o tome kako se promijeniti bilješka vrijednost tijekom izvođenja pomoću Odraz. Za ovaj ćemo primjer upotrijebiti bilješke na razini klase.

2. Bilješka

Java omogućuje stvaranje novog bilješke koristeći postojeće. U najjednostavnijem obliku bilješka je predstavljena kao @ simbol praćen nazivom napomene:

@Preuzmi

Stvorimo vlastitu napomenu Pozdrav:

@Retention (RetentionPolicy.RUNTIME) public @interface Greeter {public String greet () default ""; }

Sada ćemo stvoriti Java klasu Lijep pozdrav koja koristi razinu klase bilješka :

@Greeter (greet = "Good morning") pozdrav na javnom predavanju {} 

Sada ćemo pristupiti vrijednosti bilješke pomoću refleksije. Java klasa Razred pruža metodu getAnnotation za pristup napomenama klase:

Pozdrav pozdravu = Greetings.class.getAnnotation (Greeter.class); System.out.println ("Pozdrav," + pozdrav.greet () + "!!");

3. Izmijeni bilješku

Java klasa Razred održava mapu za upravljanje bilješkama - Bilješka razred kao ključevi i Bilješka objekt kao vrijednost:

Karta karta;

Ažurirat ćemo ovu kartu kako bismo izmijenili bilješke tijekom izvođenja. Pristup pristupu ovoj karti razlikuje se u različitim implementacijama JDK-a. Raspravit ćemo o tome za JDK7 i JDK8.

3.1.JDK 7 Implementacija

Java klasa Razred ima polje bilješke. Kako je ovo privatno polje, da bismo mu pristupili, moramo postaviti pristupnost polja na pravi. Java pruža metodu getDeclaredField za pristup bilo kojem polju pod njegovim imenom:

Bilješke o polju = Class.class.getDeclaredField (BILJEŠKE); annotations.setAccessible (true); 

Idemo sada pristupiti mapi bilješki za nastavu Pozdrav:

 Karta map = annotations.get (targetClass);

Ovo je karta koja sadrži informacije o svim bilješkama i njihovom vrijednom objektu. Želimo izmijeniti Pozdrav vrijednost bilješke koju možemo postići ažuriranjem objekta bilješke Pozdrav razred:

map.put (targetAnnotation, targetValue);

3.2.JDK 8 Implementacija

Java 8 implementacije pohranjuje bilješke informacije unutar klase AnnotationData . Ovom objektu možemo pristupiti pomoću annotationData metoda. Postavit ćemo pristupačnost za annotationData metoda za pravi jer je to privatna metoda:

Metoda metode = Class.class.getDeclaredMethod (ANNOTATION_METHOD, null); method.setAccessible (true);

Sad možemo pristupiti bilješke polje. Kako je ovo polje ujedno i privatno polje, pristup ćemo postaviti na pravi:

Bilješke polja = annotationData.getClass (). GetDeclaredField (ANNOTATIONS); annotations.setAccessible (true);

Ovo polje ima mapu predmemorije napomena koja pohranjuje klasu napomena i objekt vrijednosti. Izmijenimo to:

Karta map = annotations.get (annotationData); map.put (targetAnnotation, targetValue);

4. Primjena

Uzmimo ovaj primjer:

Pozdrav pozdravu = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Zdravo," + greetings.greet () + "!!");

Ovo će pozdraviti "Dobro jutro", jer je to vrijednost koju smo dali bilješkama.

Sada ćemo stvoriti još jedan objekt od Pozdrav tip s vrijednošću kao "Dobra večer":

Greeter targetValue = novi DynamicGreeter ("Dobra večer"); 

Ažuriraj mapu bilješki novom vrijednošću:

alterAnnotationValueJDK8 (Greetings.class, Greeter.class, targetValue);

Ponovno provjerimo vrijednost pozdrava:

pozdrav = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Zdravo," + greetings.greet () + "!!");

Pozdravit će se kao "Dobra večer".

5. Zaključak

Java implementacije koriste dva podatkovna polja za pohranu podataka napomena: bilješke, proglašenAnotacije. Razlika između ove dvije: napomena prvo pohranjuje i roditeljske klase, a kasnije se pohranjuje samo za trenutnu klasu.

Kao provedba getAnnotation razlikuje se u JDK 7 i JDK 8, ovdje koristimo bilješke karta polja radi jednostavnosti.

Kao i uvijek, izvorni kod implementacije dostupan je na Githubu.


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