Untuk mempelajari anotasi secara mendalam, kita harus bisa mendefinisikan anotasi kita sendiri dan menggunakannya. Sebelum mendefinisikan anotasi kita sendiri, kita harus memahami sintaks meta-anotasi dan anotasi definisi terkait yang disediakan oleh Java.
--------------------------------------------------- -----------------------------------
Anotasi meta:
Peran anotasi meta adalah untuk memberi anotasi pada anotasi lainnya. Java5.0 mendefinisikan empat tipe anotasi meta standar, yang digunakan untuk memberikan deskripsi tipe anotasi lainnya. Anotasi meta ditentukan oleh Java5.0:
1.@Target,
2.@Retensi,
3.@Didokumentasikan,
4.@Warisan
Tipe ini dan kelas yang didukungnya dapat ditemukan di paket java.lang.annotation. Mari kita lihat peran setiap meta-anotasi dan petunjuk penggunaan sub-parameter terkait.
--------------------------------------------------- -----------------------------------
@Target:
@Target menjelaskan cakupan objek yang dimodifikasi oleh Anotasi: Anotasi dapat digunakan untuk paket, tipe (kelas, antarmuka, enumerasi, tipe Anotasi), tipe anggota (metode, konstruktor, variabel anggota, nilai enumerasi), parameter metode, dan variabel lokal ( seperti variabel loop, parameter tangkapan). Menggunakan target dalam deklarasi tipe Anotasi dapat membuat target yang dimodifikasi menjadi lebih jelas.
Fungsi: Digunakan untuk mendeskripsikan ruang lingkup penggunaan anotasi (yaitu: di mana anotasi yang dijelaskan dapat digunakan)
Nilainya (ElementType) adalah:
1.CONSTRUCTOR : digunakan untuk mendeskripsikan konstruktor 2.FIELD : digunakan untuk mendeskripsikan domain 3.LOCAL_VARIABLE : digunakan untuk mendeskripsikan variabel lokal 4.METHOD : digunakan untuk mendeskripsikan metode 5.PACKAGE : digunakan untuk mendeskripsikan paket 6.PARAMETER : digunakan untuk mendeskripsikan parameter 7.TYPE: digunakan untuk mendeskripsikan kelas, antarmuka (termasuk tipe anotasi) atau deklarasi enum
Contoh penggunaan:
@Target(ElementType.FIELD)
publik @interface NoDBColumn {
}
--------------------------------------------------- -----------------------------------
@Penyimpanan:
@Retention menentukan lamanya waktu Anotasi dipertahankan: beberapa Anotasi hanya muncul di kode sumber dan dibuang oleh kompiler; sementara yang lain dikompilasi dalam file kelas; sementara yang lain akan dibaca ketika kelas dimuat (harap dicatat bahwa ini tidak mempengaruhi eksekusi kelas, karena Anotasi dan kelas digunakan secara terpisah). Gunakan meta-Anotasi ini untuk membatasi "siklus hidup" Anotasi.
Fungsi: Menunjukkan pada tingkat apa informasi anotasi perlu disimpan, dan digunakan untuk menjelaskan siklus hidup anotasi (yaitu: dalam cakupan apa anotasi yang dijelaskan tersebut valid)
Nilai-nilainya (RetentionPoicy) adalah:
1.SOURCE: Valid di file sumber (yaitu, file sumber dipertahankan)
2.CLASS: Valid di file kelas (yaitu kelas yang dicadangkan)
3.RUNTIME: valid saat runtime (yaitu, dipertahankan saat runtime)
Tipe meta-anotasi Retensi memiliki nilai unik sebagai anggota, dan nilainya berasal dari nilai tipe enumerasi java.lang.annotation.RetentionPolicy. Contoh spesifiknya adalah sebagai berikut:
--------------------------------------------------- -----------------------------------
@Didokumentasikan:
@Documented digunakan untuk mendeskripsikan jenis anotasi lain yang harus digunakan sebagai API publik dari anggota program yang diberi anotasi dan oleh karena itu dapat didokumentasikan oleh alat seperti javadoc. Didokumentasikan adalah anotasi markup dan tidak memiliki anggota.
Anotasi meta @Inherited adalah anotasi markup. @Inherited menyatakan bahwa tipe beranotasi tertentu diwarisi. Jika tipe anotasi yang dimodifikasi dengan @Inherited digunakan untuk suatu kelas, anotasi ini akan digunakan untuk subkelas dari kelas tersebut.
Catatan: @Jenis anotasi yang diwarisi diwarisi oleh subkelas dari kelas yang dianotasi. Sebuah kelas tidak mewarisi anotasi dari antarmuka yang diimplementasikannya, dan sebuah metode tidak mewarisi anotasi dari metode yang di-overload-nya.
Jika Retensi anotasi yang dianotasi dengan jenis anotasi @Inherited adalah RetentionPolicy.RUNTIME, API refleksi akan meningkatkan pewarisan ini. Jika kita menggunakan java.lang.reflect untuk menanyakan anotasi tipe anotasi @Inherited, pemeriksaan kode reflektif akan mulai berfungsi: memeriksa kelas dan kelas induknya hingga jenis anotasi yang ditentukan ditemukan, atau tingkat teratas dari struktur pewarisan kelas tercapai.
Contoh kode:
--------------------------------------------------- -----------------------------------
Anotasi khusus:
Saat menggunakan @interface untuk menyesuaikan anotasi, antarmuka java.lang.annotation.Annotation secara otomatis diwarisi, dan detail lainnya secara otomatis diselesaikan oleh kompiler. Saat menentukan anotasi, Anda tidak dapat mewarisi anotasi atau antarmuka lain. @interface digunakan untuk mendeklarasikan anotasi, dan setiap metode sebenarnya mendeklarasikan parameter konfigurasi. Nama metode adalah nama parameter, dan tipe nilai kembalian adalah tipe parameter (tipe nilai kembalian hanya dapat berupa tipe dasar, Kelas, String, atau enum). Anda dapat mendeklarasikan nilai default suatu parameter melalui default.
Tentukan format anotasi:
nama anotasi publik @interface {isi definisi}
Tipe data parameter anotasi yang didukung:
1. Semua tipe data dasar (int, float, boolean, byte, double, char, long, short)
2. Tipe string 3. Tipe kelas 4. Tipe enum 5. Tipe anotasi 6. Array dari semua tipe di atas
Cara mengatur parameter pada tipe Anotasi:
Pertama, hanya dapat dimodifikasi dengan dua hak akses publik atau default. Misalnya, String value(); di sini metode disetel ke tipe default;
Kedua, anggota parameter hanya dapat menggunakan delapan tipe data dasar byte, short, char, int, long, float, double, boolean dan tipe data seperti String, Enum, Class, annotations, dan array dari tipe ini. Nilai string();Anggota parameter di sini adalah String;
Ketiga, jika hanya ada satu anggota parameter, yang terbaik adalah mengatur nama parameter menjadi "nilai" diikuti dengan tanda kurung. Contoh: Anotasi FruitName pada contoh berikut hanya memiliki satu anggota parameter.
Anotasi khusus sederhana dan contoh penggunaan anotasi:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Catatan tentang nama buah
* @penulis peida
*
*/
@Target(ElementType.FIELD)
@Retensi(Kebijakan Retensi.RUNTIME)
@Didokumentasikan
publik @interface Nama Buah {
Nilai string() default "";
}
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Anotasi warna buah
* @penulis peida
*
*/
@Target(ElementType.FIELD)
@Retensi(Kebijakan Retensi.RUNTIME)
@Didokumentasikan
publik @interface FruitColor {
/**
* Pencacahan warna
* @penulis peida
*
*/
enum publik Warna{BULE,MERAH,HIJAU};
/**
* Atribut warna
* @kembali
*/
Warna buahWarna() default Warna.HIJAU;
}
impor anotasi.FruitColor.Color;
kelas publik Apple {
@FruitName("Apel")
String pribadi appleName;
@FruitColor(fruitColor=Warna.MERAH)
String pribadi appleColor;
public void setAppleColor(String appleColor) {
this.appleColor = appleColor;
}
String publik getAppleColor() {
kembalikan appleColor;
}
public void setAppleName(String nama apel) {
this.appleName = nama apel;
}
String publik getAppleName() {
kembalikan nama apel;
}
kekosongan publik nama tampilan(){
System.out.println("Nama buahnya : Apel");
}
}