Java Advanced Series (1) Java Annotation (annotation)
Anotasi Java (anotasi)
Artikel ini memperkenalkan konsep Anotasi Java dan empat fungsi Anotasi Meta yang disediakan oleh Java, serta menjelaskan metode dan tindakan pencegahan Anotasi khusus secara detail dengan contoh
konsep
Anotasi adalah fitur yang diperkenalkan di Java5. Ini menyediakan mekanisme aman yang mirip dengan komentar dan dokumen Java. Faktanya, Annotation telah banyak digunakan di berbagai framework Java, seperti Spring, Jersey, JUnit, TestNG. Anotasi setara dengan jenis metadata yang disematkan dalam program, yang dapat diurai menggunakan alat analisis anotasi atau kompiler, atau Anda dapat menentukan bahwa anotasi valid selama kompilasi atau runtime. Metadata ini tidak ada hubungannya dengan logika bisnis program dan digunakan oleh alat atau kerangka kerja yang ditentukan.
Meta Annotation
Peran Meta Annotation adalah untuk membuat anotasi anotasi lainnya. Java5 mendefinisikan 4 tipe meta-annotation standar, yang digunakan untuk memberikan instruksi untuk tipe Annotation lainnya.
@Target
@Target mengilustrasikan cakupan objek yang dimodifikasi oleh Annotation: Annotation dapat digunakan untuk paket, jenis (kelas, antarmuka, enumerasi, jenis Annotation), anggota jenis (metode, konstruktor, variabel anggota, nilai enumerasi), parameter metode dan Variabel lokal (seperti variabel loop, parameter tangkapan). Penggunaan @Target dalam deklarasi jenis Annotation dapat lebih memperjelas target yang diubah.
Peran @Target: digunakan untuk mendeskripsikan ruang lingkup anotasi, yaitu tempat anotasi yang dijelaskan dapat digunakan
@Nilai target
- KONSTRUKTUR : Digunakan untuk mendeskripsikan konstruktor
- BIDANG : Digunakan untuk mendeskripsikan domain
- LOCAL_VARIABLE : Digunakan untuk mendeskripsikan variabel lokal
- METODE : Digunakan untuk menjelaskan metode
- PAKET : Digunakan untuk mendeskripsikan paket
- PARAMETER : Digunakan untuk menjelaskan parameter
- TIPE : Digunakan untuk mendeskripsikan kelas, antarmuka (termasuk jenis anotasi) atau deklarasi enum
@Retensi
@Retention mendefinisikan siklus hidup Anotasi: beberapa Anotasi hanya muncul di kode sumber dan dibuang oleh kompilator; sementara yang lain dikompilasi dalam file kelas; Anotasi yang dikompilasi dalam file kelas dapat diabaikan oleh mesin virtual , Dan lainnya akan dibaca ketika kelas dimuat (harap dicatat bahwa itu tidak mempengaruhi pelaksanaan kelas, karena Anotasi dan kelas dipisahkan digunakan). @Retention memiliki nilai unik sebagai anggota.
@ Fungsi retensi: Menunjukkan pada tingkat apa informasi anotasi perlu disimpan, digunakan untuk menggambarkan siklus hidup anotasi (yaitu: dalam cakupan apa anotasi yang dijelaskan itu valid)
@Retention mengambil nilai dari nilai jenis enumerasi java.lang.annotation.RetentionPolicy
- SUMBER Berlaku di file sumber (yaitu, file sumber tetap ada)
- KELAS Berlaku di file kelas (yaitu, kelas yang dipesan)
- RUNTIME : Berlaku saat runtime (yaitu, dipertahankan saat runtime)
@Dokumen
@Documented digunakan untuk menjelaskan bahwa jenis anotasi lain harus digunakan sebagai API publik dari anggota program yang ditandai, sehingga dapat didokumentasikan dengan alat seperti javadoc. @Documented adalah anotasi markup dan tidak memiliki anggota.
@Warisan
@Inherited adalah anotasi tanda. Jika jenis anotasi yang dimodifikasi dengan `@ Inherited` digunakan di kelas, anotasi akan digunakan di subkelas kelas.
Anotasi Kustom
Dalam proyek aktual, skenario berikut sering ditemui: Ada banyak subclass dari kelas implementasi antarmuka atau kelas abstrak, dan seringkali perlu untuk membuat instance dan menggunakan subkelas yang berbeda sesuai dengan situasi yang berbeda (misalnya, sesuai dengan file konfigurasi). Contoh tipikal adalah penggunaan mode rantai tanggung jawab dalam hubungannya dengan pabrik.
Pada tahap ini, Anda dapat menambahkan Annotation tertentu ke setiap kelas implementasi, dan mengambil pengenal untuk kelas ini di Annotation. Aplikasi dapat menggunakan pengenal untuk menentukan subclass mana yang harus dibuat.
Contoh berikut mendefinisikan Annotation bernama Component, yang berisi variabel anggota bernama identifier.
Tambahkan @Component ke kelas implementasi yang disebutkan di atas
Pengenal yang sesuai dengan UpperCaseComponent dapat diperoleh melalui refleksi dalam aplikasi
Hasilnya adalah sebagai berikut
Pengenal untuk com.jasongj.UpperCaseComponent adalah 'atas'
Jika Anda menyetel @Retention dari @Component ke RetentionPolicy.SOURCE atau RetentionPolicy.CLASS, Anda akan mendapatkan hasil berikut, dengan memverifikasi deskripsi @Retention di atas
com.jasongj.UpperCaseComponent tidak dijelaskan oleh com.jasongj.annotation.Component
Anotasi bawaan Java
Sintaks Annotation relatif sederhana. Kecuali untuk penggunaan simbol @, pada dasarnya konsisten dengan sintaks inheren Java. Ada tiga Annotation standar bawaan di JavaSE, yang didefinisikan dalam java.lang:
@SuppressWarnnings bukan jenis token Annotation, ia memiliki anggota bertipe String, dan nilai anggota ini adalah nama peringatan yang dilarang. Peringatan umum disebutkan di bawah ini.
- tidak dicentang Peringatan saat melakukan konversi yang tidak dicentang. Misalnya, saat menggunakan koleksi, tidak ada obat generik yang digunakan untuk menentukan jenis koleksi
- akhirnya Peringatan ketika akhirnya klausa tidak dapat diselesaikan secara normal
- gagal Peringatan ketika blok sakelar mengarah langsung ke situasi berikutnya tanpa jeda
- bantahan Peringatan ketika kelas atau metode yang tidak digunakan lagi digunakan
- seriel Peringatan ketika serialVersionUID tidak ada di kelas yang dapat serial
- jalan Peringatan ketika ada jalur yang tidak ada di jalur kelas, jalur file sumber, dll.
- semua Peringatan untuk semua hal di atas
Persamaan dan perbedaan antara Anotasi dan antarmuka
- Jenis Anotasi menggunakan kata kunci @interface, bukan antarmuka. Perhatikan simbol @ di awal
- Definisi metode Annotataion dibatasi. Metode harus dideklarasikan sebagai tidak memiliki parameter dan tidak ada pengecualian yang diberikan. Metode ini juga menentukan anggota Anotasi-nama metode adalah nama anggota, dan tipe kembalian metode adalah tipe anggota. Tipe kembalian metode harus tipe dasar Java, tipe kelas, tipe enumerasi, tipe Anotasi atau array satu dimensi yang sesuai. Setelah metode ini, Anda dapat menggunakan kata kunci default dan nilai default untuk menyatakan nilai default anggota, dan null tidak dapat digunakan sebagai nilai default anggota. Umumnya, member tidak bisa generik. Generik hanya bisa digunakan jika tipenya adalah Class, karena metode ini bisa mengonversi berbagai tipe ke Class menggunakan konversi tipe
- Anotasi dan antarmuka dapat menentukan konstanta, jenis anggota statis, dan keduanya dapat diterapkan atau diwariskan
- (Materi video pendukung membuat editor pesan pribadi "belajar"!)