Nggawe anotasi minangka proses sing cukup prasaja, sanajan diwatesi dening sawetara aturan. Saiki kita kudu ngerti apa tujuan praktis sing dilayani.

Ayo kelingan carane nggawe anotasi dhewe.

Kita bakal nulis anotasi kanggo kelas lan metode lan ngemot informasi babagan penulis lan versi kode kasebut:

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

Ing ngisor iki kelas kita sing kita anotasi:

@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() {}
}

Kepiye carane bisa nggunakake data iki nalika runtime?

Kanthi nggunakake refleksi kanggo ngekstrak metadata saka anotasi. Elinga apa refleksi. Refleksi minangka mekanisme kanggo mriksa data babagan program nalika runtime. Refleksi ngidini sampeyan entuk informasi babagan kolom, metode, konstruktor kelas, lan kelas.

Kita bakal nggunakake refleksi kanggo maca anotasi ing kelas lan nampilake informasi sing dikarepake.

Kita bakal maca data saka kelas kita kanthi cara utama :

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();
       }
   }
}

Kita ngliwati conto kelas kita menyang metode readMyClass .

Banjur kita bisa ngliwati kelas uga metode kanggo metode readAnnotation . Ayo dadi - kita bakal ngliwati obyek Kelas lan obyek Metode. Butuh obyek sing ngleksanakake antarmuka AnnotatedElement . Iki ngidini kita entuk dhaptar anotasi saka obyek kasebut lan entuk informasi babagan saben obyek kasebut.

Elinga yen kita mung entuk informasi sawise mriksa apa anotasi kasebut kalebu jinis anotasi: yen (annotation instanceof Info) .

Output program menehi informasi lengkap saka anotasi:

Kelas: annotation.MyClass1
Telusuri anotasi ing java.lang.Class
Pengarang: Pengarang
Versi: 0.0
Telusuri anotasi ing java.lang.reflect.Method
Pengarang:
Versi Pengarang: 0.0

Kelas: annotation.MyClass2
Telusuri anotasi ing java.lang.
Pengarang Kelas :
Versi Pengarang: 2.0
Telusuri anotasi ing java.lang.reflect.Method
Pangarang:
Versi Anonim: 0.0

Kelas: anotasi.MyClass3
Telusuri anotasi ing java.lang.Pengarang
Kelas: Versi Anonim
: 2.0
Telusuri anotasi ing java. lang.reflect.Metode Pengarang: Versi
Anonim : 4.0

Mangkono, kanthi bantuan refleksi, kita bisa ngekstrak metadata kasebut.

Saiki ayo deleng conto nggunakake anotasi kanggo nambah kode, kalebu nambah maca, kacepetan, lan kualitas umume. Lombok bakal nulungi kita.

Lombok minangka plugin kompilator sing nggunakake anotasi kanggo ndhelikake kode sing akeh banget lan ngluwihi basa, saéngga nyederhanakake pangembangan lan nambah sawetara fungsi.

Coba conto anotasi saka Lombok:

@ToString Ngasilake implementasine saka toString () cara sing kasusun saka perwakilan pepek saka obyek: jeneng kelas, kabeh kolom, lan nilai.
@ToString
public class Example
@EqualsAndHashCode Ngasilake implementasine padha lan kode hash sing nggunakake kolom non-statis lan non-statis minangka standar, nanging bisa dikonfigurasi. Rincian liyane bisa ditemokake ing situs web proyek kasebut . Ing kana sampeyan bakal nemokake conto sing nggunakake @EqualsAndHashCode lan uga nuduhake implementasi standar tanpa anotasi.
@Getter / @Setter Ngasilake getter lan setter kanggo lapangan pribadi.
@Getter
@Setter
private String name = "name";
@NonNull Digunakake kanggo negesake yen kolom ora null nalika obyek wis instantiated. Yen ora, NullPointerException dibuwang.
public Example(@NonNull P p) {
 super("Hello");
 this.name = p.getName();
}

Lombok nduweni akeh anotasi migunani sing jarang digunakake. Kita wis nimbang anotasi sing paling gampang. Sampeyan bisa maca luwih lengkap babagan proyek kasebut ing situs web resmi .