Anotasi Kustom Java
Anotasi Java adalah beberapa informasi meta yang dilampirkan pada kode, yang digunakan untuk parsing dan menggunakan beberapa alat selama kompilasi dan runtime, dan berfungsi sebagai fungsi penjelasan dan konfigurasi.
Anotasi tidak akan dan tidak dapat mempengaruhi logika kode yang sebenarnya, dan hanya memainkan peran tambahan. Termasuk dalam paket java.lang.annotation.
1. Meta note
Meta-anotasi mengacu pada anotasi anotasi. Termasuk empat jenis: @retention @target @document @inherited.
1.1. @Retention: Tentukan strategi retensi anotasi
@Retention (retentionpolicy.source) // Anotasi hanya ada dalam kode sumber dan tidak mengandung @retention (retentionpolicy.class) // Kebijakan retensi default digunakan. Anotasi akan ada dalam file bytecode kelas, tetapi tidak dapat diperoleh saat runtime. @Retention (retentionpolicy.runtime) // anotasi akan ada di file bytecode kelas dan dapat diperoleh melalui refleksi saat runtime.
Kelas Anotasi:
@Retention (retentionpolicy.runtime) // anotasi akan ada di file bytecode kelas. @Target ({elementType.field, elementType.method} dapat diperoleh melalui refleksi pada runtime // Tentukan target anotasi ** kisaran bidang dan konstanta enumerasi/metode @terdokumentasi // menunjukkan bahwa anotasi akan dimasukkan ke dalam fielde @interface public @interface* false;/*** Nama bidang* @return*/string name () default "";/*** Apakah itu dapat diedit* @return*/boolean editing () default true;/*** apakah akan ditampilkan dalam daftar* @return*/boolean ringkasan () default true; 0;} Kelas Entitas:
public class Anno {@FieldMeta(id=true,name="serial number",order=1)private int id;@FieldMeta(name="name",order=3)private String name;@FieldMeta(name="age",order=2)private int age;@FieldMeta(description="Description",order=4)public String desc(){return "test of java reflection to obtain annotation";}public int getId () {return id;} public void setid (int id) {this.id = id;} public string getName () {return name;} public void setName (string name) {this.name = name;} public int getage () {return use; Dapatkan kelas bantuan untuk anotasi:
kelas publik sortablefield {public sortableField () {} public sortableField (fieldmeta meta, bidang bidang) {super (); this.meta = meta; this.field = field; this.name = field.getName (); this.type = field.getType ();} public sortablefield (fieldmet meta, rangkaian); meta; this.name = name; this.type = type;} private fieldmeta meta; bidang bidang pribadi; nama string pribadi; kelas pribadi <?> type; public fieldmeta getMeta () {return meta;} public void setMeta (() {field field {this.meta = meta public; field field {field field () {this. field;} public String getName () {return name;} public void setName (name string) {this.name = name;} kelas publik <?> getType () {return type;} public void setType (class <?> type) {this.type = type;}} Untuk mendapatkan anotasi saat runtime, pertama -tama buat kelas dasar:
Parent Public Class <T> {private Class <T> entitas; PUBLIK PUBLIK () {init ();}@SuppressWarnings ("Uncacked") Daftar Publik <Feristablefield> init () {Daftar <sortablefield> Daftar = new ArrayList <) Theyclass () THE THE CLASSEC (Tipe in getSlass (). Kelas (kelas, antarmuka, tipe primitif, atau batal) *, dan kemudian mengubahnya menjadi parameterisasi. . * getActualtypearguments () Mengembalikan array objek tipe yang mewakili parameter tipe aktual dari jenis ini. * [0] adalah yang pertama dalam array ini. . * Singkatnya, ini adalah untuk mendapatkan jenis parameter generik yang sebenarnya dari superclass. . */entity = (class <t>) ((parameterisasiType) this.getClass (). getGeneriCsuperclass ()). getActualtypearguments () [0]; // fieldmeta diajukan = entitas.getannotation (fieldmeta.class); if (if.entity! bidang, tetapi tidak termasuk bidang yang diwariskan* entitas.getFields (); Hanya mengembalikan semua bidang publik yang dapat diakses dari kelas atau antarmuka yang diwakili oleh objek*di kelas getDeclared ** () metode mengembalikan bidang, metode, dll. Dengan semua izin akses; * Lihat API * */Field [] Fields = Entity.getDeclaredFields (); // untuk (bidang f: bidang) {// Dapatkan anotasi yang berisi fieldmeta fieldmeta meta = f.getAnnotation (fieldmeta.class); if (meta! = Null) {sortable sf = fieldmeta.class); if (meta! = Null) {sortable sf = fieldmeta.class); if (meta! = Null) {sortable sf = fieldmeta.class); if (meta! = Null) {sortable sf = fieldMeta.class); if (meta! = Null) {sortable sf = fieldMeta); f); list.add (sf);}} // mengembalikan semua metode publik yang dapat diakses dari kelas atau antarmuka yang diwakili oleh metode objek [] Metode = entitas.getMethods (); untuk (metode m: metode) {fieldmeta meta = m.getannotation (fieldmeta.class); if (meta! = null) {sortablefield sf = new sortablefield (meta, m.getname (), m.getReturntype (); list.add (sf);}} // Metode ini untuk membuat a -field claskom (sf);}} // Metode ini untuk membuat a New -toidcom to field (sf);}} // Metode ini untuk membuat A New REVIETCOCE (SF); sortir // collections.sort (daftar, fieldsortcom baru ()); collections.sort (daftar, pembanding baru <sortablefield> () {@Overridepublic int perbandingan (sortablefield s1, sortablefield s2) {return s1.getMeta (). order ()-s2.getMeta (). s1.getName (). compareTo (s2.getname ()); // Anda juga dapat menggunakan perbandingan untuk perbandingan}});} daftar pengembalian;}} Buat subkelas untuk mewarisi kelas dasar:
Anak kelas publik memperluas orang tua <nno> {} Kelas Tes:
TestAnnotation kelas publik {@suppresswarnings ({"Uncecked", "RawTypes"}) public static void main (string [] args) {parent c = new child (); list <rortablefield> list = c.init (); // get the annotation di kelas dalam generik/output field (c.init (); // list. "+l.getName ()+"/T Jenis bidang: "+l.getType ()+"/t Nama anotasi: "+l.getMeta (). Name ()+"/t Annotation Deskripsi: "+l.getMeta (). Deskripsi ());}}}}/////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
1. Prinsip kerja anotasi:
JDK5.0 menyediakan fungsionalitas anotasi, memungkinkan pengembang untuk mendefinisikan dan menggunakan jenis anotasi mereka sendiri. Fungsi ini terdiri dari sintaks yang mendefinisikan jenis anotasi dan sintaks yang menjelaskan deklarasi anotasi, API yang membaca anotasi, file kelas yang menggunakan anotasi untuk memodifikasi, dan alat pemrosesan anotasi.
Anotasi tidak secara langsung mempengaruhi semantik kode, tetapi dapat dianggap sebagai alat atau perpustakaan kelas program. Pada gilirannya akan memiliki beberapa efek pada semantik program berjalan.
Anotasi dapat dibaca dengan berbagai cara melalui mekanisme refleksi selama runtime.
2. Anotasi @Override:
java.lang
Jenis Komentar Override
@Target (value = metode)
@Retention (nilai = sumber)
Public @Interface Override berarti bahwa deklarasi metode bermaksud untuk mengesampingkan deklarasi metode lain di superclass. Jika metode ini menjelaskan jenis anotasi ini tetapi tidak mengganti metode superclass, kompiler menghasilkan pesan kesalahan.
Anotasi @Override berarti bahwa subkelas perlu mengganti metode yang sesuai dari kelas induk.
Override adalah anotasi penanda yang digunakan untuk mengidentifikasi anotasi. Nama anotasi itu sendiri mewakili informasi yang akan diberikan kepada program alat.
Berikut adalah contoh menggunakan anotasi @Override:
kelas A {private string id; A (string id) {this.id = id; } @Override public string toString () {return id; }}3. @Deprecated Anotasi:
java.lang
Jenis Komentar sudah usang
@Documented
@Retention (value = runtime)
Public @Interface Elements Program Tercuslah Dialihkan dengan @Deprecated, programmer tidak disarankan untuk menggunakan elemen tersebut, biasanya karena berbahaya atau ada pilihan yang lebih baik. Kompiler memperingatkan saat menggunakan elemen program yang tidak disetujui atau melakukan penulisan ulang dalam kode yang tidak disetujui.
@Metode Representasi Anotasi yang Dikirim Tidak Disarankan.
Tercerahkan adalah anotasi penanda.
Berikut adalah contoh menggunakan anotasi @Deprecated:
kelas A {private string id; A (string id) {this.id = id; } @Deprecated public void execute () {System.out.println (id); } public static void main (string [] args) {a = new a ("a123"); A. execute (); }}4. Anotasi @suppresswarnings:
java.lang
Komentar TypeSuppressWarnings
@Target (value = {type, bidang, metode, parameter, konstruktor, local_variable})
@Retention (nilai = sumber)
Public @Interface SuppressWarnings menunjukkan bahwa peringatan kompiler yang ditentukan harus tidak dimainkan dalam elemen komentar (dan semua elemen program yang terkandung dalam elemen komentar itu). Perhatikan bahwa serangkaian peringatan yang tidak dimainkan dalam elemen yang diberikan adalah superset dari semua peringatan yang tidak dimainkan dalam elemen. Misalnya, jika Anda mengomentari kelas untuk melepaskan peringatan dan membuat anotasi metode untuk melepaskan peringatan lain, kedua peringatan akan tidak ditandai dalam metode ini.
Bergantung pada gayanya, pemrogram harus selalu menggunakan anotasi ini pada elemen bersarang terdalam, dan itu hanya akan bekerja jika digunakan di sana. Jika Anda ingin melepaskan peringatan dalam metode tertentu, Anda harus mengomentari metode ini alih -alih kelasnya.
@SuppressWarnings Anotasi menunjukkan peringatan penindasan.
Berikut adalah contoh menggunakan anotasi @suppresswarnings:
@SuppressWarnings ("Uncecked") public static void main (string [] args) {list list = new arraylist (); list.add ("ABC");}5. Anotasi Kustom:
Saat menggunakan @Interface untuk anotasi khusus, antarmuka java.lang.Annotation.Annotation diwariskan secara otomatis, dan detail lainnya secara otomatis diselesaikan oleh kompiler. Saat mendefinisikan anotasi, anotasi atau antarmuka lain tidak dapat diwarisi.
Kustomisasi komentar termudah:
public @interface myannotation {} Gunakan anotasi khusus: kelas publik annotationTest2 {@myannotation public void execute () {System.out.println ("Method"); }} 5.1. Tambahkan variabel:
public @interface myannotation {string value1 ();} Gunakan anotasi khusus: kelas publik annotationTest2 {@myannotation (value1 = "abc") public void execute () {system.out.println ("Method"); }}Ketika nama atribut yang digunakan dalam anotasi adalah nilai, antarmuka nilai atribut dapat ditulis secara langsung tanpa menentukan nama atribut saat menetapkannya; Kecuali untuk nama nilai variabel yang tidak terduga, semua nama variabel harus ditetapkan menggunakan name = nilai.
5.2. Tambahkan nilai default:
public @interface myannotation {string value1 () default "abc";}5.3. Penggunaan Penggunaan Multivariat:
public @interface myannotation {string value1 () default "abc"; Myenum value2 () default myenum.sunny;} enum myenum {Sunny, rainy} Gunakan Anotasi Kustom:
Public Class AnnotationTest2 {@myannotation (value1 = "a", value2 = myenum.sunny) public void execute () {System.out.println ("Metode"); }} 5.4. Variabel array:
public @interface myannotation {string [] value1 () default "abc";} Gunakan Anotasi Kustom:
kelas publik annotationTest2 {@myannotation (value1 = {"a", "b"}) public void execute () {System.out.println ("Method"); }}6. Tetapkan ruang lingkup anotasi:
@Documented
@Retention (value = runtime)
@Target (value = annotation_type)
Retensi @Interface publik menunjukkan berapa lama anotasi jenis anotasi harus dipertahankan. Jika anotasi retensi tidak ada dalam deklarasi jenis komentar, kebijakan retensi default ke retensipolicy.class.
Komentar meta target hanya valid ketika jenis komentar meta secara langsung digunakan untuk komentar. Jika jenis komentar meta digunakan sebagai anggota dari jenis komentar lain, itu tidak valid.
PUBLIK ENUM Retensi
memperluas enum <RetentionPolicy> KOMENTAR RETENTION PIBY. Konstanta untuk jenis enum ini menggambarkan berbagai strategi untuk menjaga komentar. Mereka digunakan dengan jenis komentar meta retensi untuk menentukan berapa lama anotasi dipertahankan.
KELAS
Kompiler akan mencatat komentar di file kelas, tetapi VM tidak perlu menyimpan komentar saat runtime.
Runtime
Kompiler akan merekam komentar dalam file kelas, dan VM akan mempertahankan komentar saat runtime, sehingga dapat dibaca secara reflektif.
SUMBER
Komentar untuk membuang kompiler. Anotasi @Retention dapat memberikan kebijakan retensi anotasi untuk kompiler saat mendefinisikan anotasi.
Anotasi milik kebijakan retensi kelas adalah @suppresswarnings, yang tidak akan disimpan dalam file .class.
6.1. Contoh Penggunaan dalam Anotasi Kustom:
@Retention (retentionpolicy.class) public @interface myannotation {string [] value1 () default "abc";}7. Contoh penggunaan refleksi untuk membaca informasi anotasi kebijakan retensi runtime:
java.lang.reflect
Antarmuka AnnotatedElement
Semua kelas implementasi yang diketahui:
AccessableObject, kelas, konstruktor, bidang, metode, paket mewakili elemen komentar dari program yang saat ini berjalan di VM ini. Antarmuka ini memungkinkan pembacaan komentar refleksif. Semua komentar yang dikembalikan dengan metode dalam antarmuka ini tidak dapat diubah dan berseri. Penelepon dapat memodifikasi array yang dikembalikan oleh aksesor anggota array yang ditetapkan yang disebutkan; Ini tidak akan berpengaruh pada array yang dikembalikan oleh penelepon lain.
Jika metode dalam antarmuka ini mengembalikan komentar (secara langsung atau tidak langsung) yang berisi anggota kelas yang ditugaskan yang merujuk kelas yang tidak dapat diakses dalam VM ini, mencoba membaca kelas dengan memanggil metode yang dikembalikan oleh kelas yang relevan pada komentar yang dikembalikan akan menghasilkan TypenotPresentException.
isannotationpresent
boolean isannotationPresent (kelas <? Extends Annotation> AnnotationClass) Mengembalikan true jika komentar dari tipe yang ditentukan ada pada elemen ini, jika tidak mengembalikan false. Metode ini terutama dirancang untuk memfasilitasi akses ke tag komentar.
parameter:
AnnotationClass - Objek kelas yang sesuai dengan jenis anotasi
kembali:
Kembalikan true jika komentar dari jenis komentar yang ditentukan ada pada objek ini, jika tidak salah
Melemparkan:
NullpointerException - Jika kelas anotasi yang diberikan nol
Mulailah dengan versi berikut:
1.5
getNotation
<Tpanjang anotasi> t getannotation (class <t> annotationclass) Mengembalikan komentar ini jika ada komentar dari jenis elemen yang ditentukan, jika tidak null dikembalikan.
parameter:
AnnotationClass - Objek kelas yang sesuai dengan jenis anotasi
kembali:
Jika komentar dari jenis komentar yang ditentukan dari elemen ada pada objek ini, komentar ini dikembalikan, jika tidak nol
Melemparkan:
NullpointerException - Jika kelas anotasi yang diberikan nol
Mulailah dengan versi berikut:
1.5
getNotations
Anotasi [] getAnnotations () mengembalikan semua komentar yang ada pada elemen ini. (Jika elemen ini tidak dikomentari, array panjang nol dikembalikan.) Penelepon metode dapat memodifikasi array yang dikembalikan sesuka hati; Ini tidak akan berpengaruh pada array yang dikembalikan oleh penelepon lain.
kembali:
Semua komentar yang ada di elemen ini
Mulailah dengan versi berikut:
1.5
getDeclaredAnnotations
Anotasi [] getDeclaredAnnotations () mengembalikan semua komentar yang ada secara langsung pada elemen ini. Tidak seperti metode lain dalam antarmuka ini, metode ini mengabaikan anotasi yang diwariskan. (Jika tidak ada komentar langsung pada elemen ini, array panjang nol dikembalikan.) Penelepon metode dapat memodifikasi array yang dikembalikan sesuka hati; Ini tidak akan berpengaruh pada array yang dikembalikan oleh penelepon lain.
kembali:
Semua komentar yang ada langsung pada elemen ini
Mulailah dengan versi berikut:
1.5
Berikut adalah contoh penggunaan refleksi untuk membaca informasi anotasi dari kebijakan retensi runtime:
Anotasi Kustom:
@Retention (retentionpolicy.runtime) public @interface myannotation {string [] value1 () default "abc";} Gunakan Anotasi Kustom:
Public Class AnnotationTest2 {@MyAnnotation (value1 = {"a", "b"}) @Deprecated public void execute () {System.out.println ("Method"); }} Baca informasi dalam anotasi:
public static void main (String [] args) melempar Exception Security, NosuchMethodeException, IllegalargumentException, IllegalAccessException, InvocationTargetException {annotationTest2 annotationTest2 = new annotationTest2 (); // GetSclass Instance dari AnnotationTest2Class <nnotationTest2> c = annotationTest2.class; // GetMethodInstance Metode Metode Metode = C.GetMethod ("Execute", kelas baru [] {}); // Tentukan apakah metode ini berisi anotasi myannotation if (method.isannotationPresent (myannotation.class)) {// Dapatkan contoh anotasi myannotation dari metode ini myannotation myannotation = method.getannotation (myannotation.class); // jalankan metode.invoke (annotationTest2, objek baru [] {}); // Dapatkan myannotation string [] value1 = myannotation.value1 (); System.out.println (value1 [0]); } // Dapatkan semua anotasi pada metode anotasi [] anotasi = method.getAnnotations (); untuk (anotasi anotasi: anotasi) {system.out.println (anotasi); }}8. Penggunaan anotasi terbatas:
Anotasi terbatas menggunakan @target.
@Documented
@Retention (value = runtime)
@Target (value = annotation_type)
Target @Interface public menunjukkan jenis elemen program yang berlaku jenis anotasi. Jika komentar meta target tidak ada dalam deklarasi jenis komentar, tipe yang dinyatakan dapat digunakan pada elemen program apa pun. Jika ada komentar meta seperti itu, kompiler menegakkan batas penggunaan yang ditentukan. Misalnya, komentar meta ini menunjukkan bahwa jenis deklarasi itu sendiri, yaitu jenis komentar meta. Itu hanya dapat digunakan pada deklarasi jenis komentar:
@Target (elementType.annotation_type) public @interface metaannotationType {...} Komentar meta ini menunjukkan bahwa jenis deklarasi hanya dapat digunakan sebagai jenis anggota dalam deklarasi jenis anotasi yang kompleks. Itu tidak dapat digunakan secara langsung untuk komentar:
@Target ({}) public @interface MemberType {...} Ini adalah kesalahan waktu kompilasi yang menunjukkan bahwa konstanta elementType muncul lebih dari sekali dalam komentar target. Misalnya, komentar meta berikut adalah ilegal:
@Target ({elementType.field, elementType.method, elementType.field}) public @interface BOGUS {...} Public Enum ElementType PublicPerluaja Enum <semem SementalType> Jenis Elemen Program. Konstanta jenis enum ini memberikan klasifikasi sederhana elemen yang dinyatakan dalam program Java.
Konstanta ini digunakan dengan jenis komentar meta target untuk ditentukan dalam keadaan apa legal untuk menggunakan jenis komentar.
Annotation_type
Deklarasi Jenis Komentar
Konstruktor
Pernyataan Metode Konstruktor
BIDANG
Deklarasi Lapangan (termasuk konstanta enumerasi)
Local_variable
Deklarasi Variabel Lokal
METODE
Pernyataan metode
KEMASAN
Pernyataan paket
PARAMETER
Deklarasi Parameter
JENIS
Kelas, antarmuka (termasuk jenis komentar) atau deklarasi enumerasi
Contoh Keterbatasan Penggunaan Anotasi:
@Target (elementType.method) public @interface myannotation {string [] value1 () default "abc";}9. Tambahkan catatan ke dokumen bantuan:
Untuk menambahkan informasi anotasi ke file API saat membuat file Javadoc, Anda dapat menggunakan java.lang.annotation.documented.
Deklarasikan dokumen anotasi build dalam anotasi khusus:
@Documentedpublic @interface myannotation {string [] value1 () default "abc";} Gunakan Anotasi Kustom:
kelas publik annotationTest2 {@myannotation (value1 = {"a", "b"}) public void execute () {System.out.println ("Method"); }}10. Gunakan warisan dalam anotasi:
Secara default, anotasi tidak diwarisi ke subkelas. Anda dapat menambahkan java.lang.Annotation.Inherited Deklarasi Anotasi Saat Anotasi Kustom Digunakan.
@Documented
@Retention (value = runtime)
@Target (value = annotation_type)
Public @Interface diwariskan menunjukkan bahwa tipe anotasi diwariskan secara otomatis. Jika anotasi meta yang diwariskan ada dalam deklarasi jenis komentar dan pengguna menanyakan jenis komentar dalam deklarasi kelas, dan tidak ada komentar jenis ini dalam deklarasi kelas, jenis komentar akan secara otomatis diminta di superclass kelas. Proses ini diulangi sampai jenis komentar ini ditemukan atau tingkat atas hierarki kelas tercapai. Jika tidak ada superclass yang memiliki anotasi jenis itu, kueri akan menunjukkan bahwa kelas saat ini tidak memiliki anotasi seperti itu.
Perhatikan bahwa jika Anda menggunakan jenis anotasi untuk mengomentari apa pun selain kelas, jenis komentar meta ini tidak valid. Perhatikan juga bahwa komentar meta ini hanya memfasilitasi warisan komentar dari superclasses; Ini tidak valid untuk komentar untuk antarmuka yang diimplementasikan.
Artikel di atas secara singkat berbicara tentang anotasi khusus Java dan penggunaan refleksi untuk mendapatkan anotasi selama runtime adalah semua konten yang saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.