Manfaat utama anotasi tidak diperoleh daripada menggunakan anotasi standard yang sudah ada dalam JDK. Pada masa yang sama, jarang terdapat keperluan untuk membuat anotasi anda sendiri. Tetapi jika kita sedang membangunkan sistem yang besar atau mencipta perpustakaan yang berasingan, maka pada peringkat seni bina, melaksanakan anotasi kita sendiri pasti akan menghasilkan dividen.

Mari cuba buat anotasi.

Untuk melakukan ini, buat fail, tetapi bukannya menulis kelas atau antara muka , tulis @interface . Ini akan menjadi fail untuk anotasi kami. Struktur dalaman anotasi adalah serupa dengan antara muka.


public @interface Sum {
   int sum() default 0;
}

@interface menunjukkan bahawa ini adalah anotasi,
lalai mengatakan bahawa parameter akan mempunyai nilai lalai tertentu.

Ta-da! Kami membuat anotasi! Secara teorinya kita sudah boleh menggunakannya, tetapi pertama-tama adalah lebih baik untuk mengkonfigurasinya.

Tanpa konfigurasi, anotasi kami boleh digunakan pada apa-apa sahaja (kepada kelas, kaedah, atribut, dll.), jadi tidak masuk akal untuk menggunakannya pada ketika ini. Walaupun kelihatan pelik, anotasi kami perlu dianotasi dengan anotasi lain!

Mari mulakan dengan @Target .

Anotasi @Target (berkaitan sejak Java 1.5) mengehadkan keupayaan untuk menggunakan anotasi. Untuk mengehadkan penggunaan pada tahap tertentu, kita perlu menghantar hujah kepada anotasi @Target untuk menunjukkan jenis yang boleh digunakan. Berikut adalah beberapa jenis yang biasa digunakan:

@Target(ElementType.PACKAGE) untuk pakej
@Target(ElementType.TYPE) untuk kelas
@Target(ElementType.CONSTRUCTOR) untuk pembina
@Target(ElementType.METHOD) untuk kaedah
@Target(ElementType.FIELD) untuk atribut (pembolehubah) dalam kelas
@Target(ElementType.PARAMATER) untuk parameter kaedah
@Target(ElementType.LOCAL_VARIABLE) untuk pembolehubah tempatan

Jika anda memerlukan anotasi untuk beberapa jenis, maka anda boleh menghantar beberapa hujah sebagai tatasusunan:


@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

Bahagian penting konfigurasi seterusnya ialah anotasi @Retention .

Anotasi ini menunjukkan bahagian kitaran hayat kod yang mana anotasi kami akan tersedia:

Dasar Pengekalan.SUMBER Anotasi yang ditandakan dengan dasar pengekalan SOURCE dibuang pada masa tayangan.
Dasar Pengekalan.KELAS Anotasi yang ditandakan dengan dasar pengekalan CLASS ditulis pada fail .class , tetapi dialih keluar pada masa jalankan.
Polisi Pengekalan.RUNTIME Anotasi yang ditandakan dengan dasar pengekalan RUNTIME kekal pada masa jalankan dan boleh diakses dalam program kami pada masa jalankan.

Terdapat beberapa anotasi lagi yang boleh anda gunakan untuk konfigurasi:

Anotasi Nilai
@Diwarisi Menunjukkan bahawa kelas terbitan mewarisi pelaksanaan kelas induk bagi anotasi.
@Didokumenkan Ini menunjukkan bahawa anotasi akan disertakan dalam dokumentasi Javadoc yang dihasilkan.

Sekarang mari cuba buat anotasi kita sendiri.

Kami akan membuat anotasi untuk kelas dan kaedah serta mengandungi maklumat tentang pengarang dan versi kod:


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

Kami boleh menggunakan anotasi kami pada kaedah dan kelas. Metadata anotasi kami akan tersedia pada masa jalankan. Beri perhatian kepada parameter anotasi kami: Kami boleh membekalkan dua argumen (pengarang dan versi), atau kami boleh meninggalkannya. Jika kami meninggalkannya, maka nilai lalai yang ditentukan ( lalai "Pengarang" dan lalai "0.0" ) akan digunakan.

Perlu diingat bahawa kita tidak perlu menentukan nilai lalai untuk parameter. Dalam kes ini, parameter menjadi wajib.

Apabila menghantar hujah, kita mesti menentukan parameter yang sepadan menggunakan nilai notasi = "nilai" . Parameter mesti sentiasa dinamakan secara eksplisit, walaupun anotasi mempunyai satu parameter.

Mari gunakan anotasi kami pada beberapa kelas:


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