Endring av kommentarparametere ved kjøretid

1. Oversikt

Kommentarer , en form for metadata som du kan legge til i Java-kode. Disse kommentarer kan behandles på kompileringstidspunkt og bygges inn i klassefiler, eller kan beholdes og åpnes ved kjøretid ved hjelp av Speilbilde .

I denne artikkelen vil vi diskutere hvordan du kan endre kommentar verdi ved kjøretid ved bruk Speilbilde. Vi vil bruke klassenivåkommentarer for dette eksemplet.

2. Kommentar

Java tillater å skape nytt kommentarer bruker eksisterende. I den enkleste formen er en kommentar representert som @ symbol etterfulgt av merknadsnavn:

@Overstyring

La oss lage vår egen kommentar Greeter:

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

Nå skal vi lage en Java-klasse Hilsener som bruker klassenivå kommentar :

@Greeter (greet = "Good morning") Hilsen til offentlig klasse {} 

Nå får vi tilgang til merknadsverdien ved hjelp av refleksjon. Java-klasse Klasse gir en metode getAnnotation for å få tilgang til merknader for en klasse:

Greeter-hilsener = Greetings.class.getAnnotation (Greeter.class); System.out.println ("Hei," + hilsen.greet () + "!!");

3. Endre kommentar

Java-klasse Klasse vedlikeholder et kart for håndtering av merknader - Kommentar klasse som nøkler og Kommentar objekt som verdi:

Kart kart;

Vi oppdaterer dette kartet for å endre merknaden under kjøretid. Tilnærming for å få tilgang til dette kartet er forskjellig i forskjellige JDK-implementeringer. Vi vil diskutere det for JDK7 og JDK8.

3.1.JDK 7 Implementering

Java-klasse Klasse har felt kommentarer. Siden dette er et privat felt, for å få tilgang til det, må vi stille tilgjengeligheten til feltet til ekte. Java gir metode getDeclaredField for å få tilgang til et felt ved navn:

Feltkommentarer = Class.class.getDeclaredField (ANNOTATIONS); annotations.setAccessible (true); 

La oss nå få tilgang til merknadskart for kurset Greeter:

 Kart map = annotations.get (targetClass);

Dette er kartet som inneholder informasjon om alle merknader og deres verdiobjekt. Vi vil endre Greeter kommentarverdi som vi kan oppnå ved å oppdatere kommentarobjektet av Greeter klasse:

map.put (targetAnnotation, targetValue);

3.2.JDK 8 Implementering

Java 8 implementeringsbutikker kommentarer informasjon i en klasse Annotasjonsdata . Vi kan få tilgang til dette objektet ved hjelp av merknadData metode. Vi vil sette tilgjengelighet for merknadData metode til ekte som det er en privat metode:

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

Nå kan vi få tilgang kommentarer felt. Siden dette feltet også er et privat felt, vil vi sette tilgjengelighet til ekte:

Feltkommentarer = annotationData.getClass (). GetDeclaredField (ANNOTATIONS); annotations.setAccessible (true);

Dette feltet har cache-kart for merknader som lagrer merknadsklasse og verdiobjekt. La oss endre det:

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

4. Søknad

La oss ta dette eksemplet:

Greeter-hilsener = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Hei," + hilsen.greet () + "!!");

Dette vil hilse på "God morgen", da det er verdien vi ga kommentarene.

Nå skal vi lage et objekt til Greeter skriv inn med verdien som “God kveld”:

Greeter targetValue = new DynamicGreeter ("God kveld"); 

La oss oppdatere merknadskartet med den nye verdien:

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

La oss sjekke hilsenverdien igjen:

hilsener = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Hei," + hilsen.greet () + "!!");

Det vil hilse som “God kveld”.

5. Konklusjon

Java-implementeringer bruker to datafelt for å lagre merknadsdata: kommentarer, erklærte merknader. Forskjellen mellom disse to: første butikkkommentarer fra overordnede klasser og senere lagrer en bare for nåværende klasse.

Som implementeringen av getAnnotation er forskjellig i JDK 7 og JDK 8, vi bruker her kommentarer feltkart for enkelhet.

Og som alltid er implementeringskildekoden tilgjengelig på Github.


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