Ændring af kommentarparametre ved kørselstid

1. Oversigt

Kommentarer , en form for metadata, som du kan tilføje til Java-kode. Disse kommentarer kan behandles ved kompileringstidspunkt og integreres i klassefiler eller kan opbevares og tilgås ved kørsel ved hjælp af Afspejling .

I denne artikel vil vi diskutere, hvordan man ændrer sig kommentar værdi ved kørsel ved hjælp af Afspejling. Vi bruger klassemarkering til dette eksempel.

2. Kommentar

Java tillader oprettelse af nyt kommentarer ved hjælp af eksisterende. I den enkleste form er en kommentar repræsenteret som @ symbol efterfulgt af annoteringsnavn:

@Override

Lad os oprette vores egen kommentar Greeter:

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

Nu opretter vi en Java-klasse Vær hilset der bruger klasseniveau kommentar :

@Greeter (greet = "Good morning") Offentlig klasse hilsner {} 

Nu får vi adgang til annoteringsværdien ved hjælp af refleksion. Java-klasse Klasse giver en metode getAnnotation for at få adgang til kommentarer til en klasse:

Greeter hilsner = Greetings.class.getAnnotation (Greeter.class); System.out.println ("Hej der," + hilsen.greet () + "!!");

3. Ændre kommentar

Java-klasse Klasse vedligeholder et kort til håndtering af kommentarer - Kommentar klasse som nøgler og Kommentar objekt som værdi:

Kort kort;

Vi opdaterer dette kort for at ændre kommentar under kørsel. Tilgang til at få adgang til dette kort er forskellig i forskellige JDK-implementeringer. Vi vil diskutere det til JDK7 og JDK8.

3.1.JDK 7 Implementering

Java-klasse Klasse har felt kommentarer. Da dette er et privat felt, for at få adgang til det, skal vi indstille tilgængeligheden af ​​feltet til rigtigt. Java giver metode getDeclaredField for at få adgang til ethvert felt med dets navn:

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

Lad os nu få adgang til annoteringskort til klasse Greeter:

 Kort map = annotations.get (targetClass);

Dette er kortet, der indeholder information om alle kommentarer og deres værdiobjekt. Vi vil ændre Greeter annoteringsværdi, som vi kan opnå ved at opdatere annotationsobjektet for Greeter klasse:

map.put (targetAnnotation, targetValue);

3.2.JDK 8 Implementering

Java 8 implementeringsbutikker kommentarer information inde i en klasse AnnotationData . Vi kan få adgang til dette objekt ved hjælp af annotationData metode. Vi indstiller tilgængelighed til annotationData metode til rigtigt da det er en privat metode:

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

Nu kan vi få adgang kommentarer Mark. Da dette felt også er et privat felt, indstiller vi tilgængelighed til rigtigt:

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

Dette felt har cache-kort med annoteringer, der gemmer annoteringsklasse og værdiobjekt. Lad os ændre det:

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

4. Ansøgning

Lad os tage dette eksempel:

Greeter hilsner = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Hej der," + hilsen.greet () + "!!");

Dette hilses "God morgen", da det er den værdi, vi har givet til kommentar.

Nu opretter vi endnu et objekt til Greeter skriv med værdi som “God aften”:

Greeter targetValue = ny DynamicGreeter ("God aften"); 

Lad os opdatere kommentarkortet med den nye værdi:

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

Lad os kontrollere hilsenværdien igen:

hilsner = Greetings.class.getAnnotation (Greeter.class); System.err.println ("Hej der," + hilsen.greet () + "!!");

Det vil hilse som “God aften”.

5. Konklusion

Java-implementeringer bruger to datafelt til at gemme annoteringsdata: kommentarer, erklærede bemærkninger. Forskellen mellem disse to: første butiksnoteringer fra overordnede klasser, og senere gemmer man kun for den aktuelle klasse.

Som gennemførelsen af getAnnotation adskiller sig i JDK 7 og JDK 8, vi bruger her kommentarer feltkort for enkelhed.

Og som altid er implementeringskildekoden tilgængelig på Github.


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