Å lage kommentarer er en ganske enkel prosess, selv om den er begrenset av noen regler. Nå må vi finne ut hvilket praktisk formål de tjener.

La oss huske hvordan vi lager vår egen merknad.

Vi vil skrive en merknad som er for klasser og metoder og inneholder informasjon om kodens forfatter og versjon:


@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

Her er våre klasser som vi har kommentert:


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}

Hvordan kan vi bruke disse dataene under kjøring?

Ved å bruke refleksjon for å trekke ut metadata fra merknader. Husk hva refleksjon er. Refleksjon er en mekanisme for å undersøke data om et program under kjøring. Refleksjon lar deg få informasjon om felt, metoder, klassekonstruktører og klasser.

Vi bruker refleksjon til å lese merknadene i en klasse og vise informasjonen vi ønsker.

Vi leser data fra klassene våre i hovedmetoden :


import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
 
public class Main {
   public static void main(String[] args) throws NoSuchMethodException {
       readMyClass(MyClass1.class);
       readMyClass(MyClass2.class);
       readMyClass(MyClass3.class);
   }
 
   static void readMyClass(Class<?> myClassObj) throws NoSuchMethodException {
       System.out.println("\nClass: " + myClassObj.getName());
       readAnnotation(myClassObj);
       Method method = myClassObj.getMethod("myClassMethod");
       readAnnotation(method);
   }
 
   static void readAnnotation(AnnotatedElement element) {
       try {
           System.out.println("Search for annotations in " + element.getClass().getName());
           Annotation[] annotations = element.getAnnotations();
           for (Annotation annotation : annotations) {
               if (annotation instanceof Info) {
                   final Info fileInfo = (Info) annotation;
                   System.out.println("Author: " + fileInfo.author());
                   System.out.println("Version: " + fileInfo.version());
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

Vi sender en forekomst av klassen vår til readMyClass -metoden.

Da kan vi sende en klasse så vel som en metode til readAnnotation -metoden. La oss gjøre det - vi sender et klasseobjekt og et metodeobjekt. Det tar et objekt som implementerer AnnotatedElement - grensesnittet. Dette lar oss få en liste over merknader fra objektet og få informasjon om hver av dem.

Merk at vi først får informasjon etter å ha sjekket om merknaden tilhører vår merknadstype: if (annotasjonsforekomst av Info) .

Programutgangen gir oss fullstendig informasjon fra merknadene:

Klasse: annotation.MyClass1
Søk etter merknader i java.lang.Class
Forfatter: Forfatter
Versjon: 0.0
Søk etter merknader i java.lang.reflect.Method
Forfatter: Forfatter
Versjon: 0.0

Klasse: annotation.MyClass2
Søk etter merknader i java.lang. Klasse
Forfatter: Forfatter
Versjon: 2.0
Søk etter merknader i java.lang.reflect.Method
Forfatter: Anonym
Versjon: 0.0

Klasse: annotering.MyClass3
Søk etter merknader i java.lang.Class
Forfatter: Anonym
Versjon: 2.0
Søk etter merknader i java. lang.reflect.Metode
Forfatter: Anonym
Versjon: 4.0

Dermed kunne vi ved hjelp av refleksjon hente ut metadataene.

La oss nå se på et eksempel på bruk av merknader for å forbedre kode, inkludert økt lesbarhet, hastighet og kvalitet generelt. Lombok vil hjelpe oss med dette.

Lombok er en kompilatorplugin som bruker merknader for å skjule en enorm mengde kode og utvide språket, og dermed forenkle utviklingen og legge til noe funksjonalitet.

Tenk på et eksempel på merknader fra Lombok:

@ToString Genererer en implementering av toString() -metoden som består av en grundig representasjon av objektet: klassenavnet, alle feltene og deres verdier.

@ToString
public class Example
@EqualsAndHashCode Genererer implementeringer av equals og hashCode som bruker ikke-statiske og ikke-statiske felt som standard, men som kan konfigureres. Flere detaljer finner du på prosjektets hjemmeside . Der finner du et eksempel som bruker @EqualsAndHashCode og viser også en standardimplementering uten merknaden.
@Getter / @Setter Genererer gettere og settere for private felt.

@Getter 
@Setter 
private String name = "name";
@NonNull Brukes til å hevde at felt ikke er null når et objekt instansieres. Ellers blir et NullPointerException kastet.

public Example(@NonNull P p) {
 super("Hello");
 this.name = p.getName();
}

Lombok har mange flere nyttige merknader som brukes sjeldnere. Vi har vurdert dens enkleste merknader. Du kan lese mer om prosjektet på den offisielle nettsiden .