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.