1. RetentionPolicy.source: Anotasi hanya dipertahankan dalam file sumber. Ketika file Java dikompilasi ke dalam file kelas, anotasi ditinggalkan;
2. RetentionPolicy.class: Anotasi disimpan ke file kelas, tetapi ditinggalkan ketika JVM memuat file kelas. Ini adalah siklus hidup default;
3. RetentionPolicy.runtime: Anotasi tidak hanya disimpan ke file kelas, tetapi masih ada setelah JVM memuat file kelas;
Tiga siklus hidup ini sesuai dengan: file sumber java (file .java) --->. File kelas ----> bytecode dalam memori.
Jadi, bagaimana Anda memilih siklus hidup anotasi yang tepat?
Pertama -tama, kita harus mengklarifikasi sumber panjang siklus hidup <class <class <runtime, jadi di mana yang pertama dapat bertindak, yang terakhir dapat bertindak. Secara umum, jika Anda perlu secara dinamis mendapatkan informasi anotasi saat runtime, Anda hanya dapat menggunakan anotasi runtime; Jika Anda ingin melakukan beberapa operasi preprocessing pada waktu kompilasi, seperti menghasilkan beberapa kode tambahan (seperti Butterknife), Anda dapat menggunakan anotasi kelas; Jika Anda hanya melakukan beberapa operasi pemeriksaan, seperti @Override dan @suppressWarnings, Anda dapat menggunakan anotasi sumber.
Berikut ini adalah aplikasi sederhana dari anotasi runtime.
Dapatkan anotasi
Anda perlu mendapatkan anotasi runtime melalui refleksi, yang dapat diperoleh dari paket, kelas, bidang, metode .... metode dasarnya sama. Beberapa metode umum adalah sebagai berikut:
/*** Dapatkan anotasi dari tipe yang ditentukan*/publik <A Extends Annotation> a getannotation (kelas <a> annotationType);/*** Dapatkan semua anotasi, jika ada anotasi publik [] getannotation (); get nnotation (] apakah ada annotasi yang diwariskan (). elemen, kembalikan true jika ada, sebaliknya false*/public boolean isannotationpresent (class <? extends annotation> annotationType);/***Dapatkan semua anotasi untuk parameter dalam metode*/anotasi publik [] [] getParameterAnnotations ();
Untuk menggunakan fungsi -fungsi ini, Anda harus terlebih dahulu mendapatkan elemen yang sesuai melalui refleksi: kelas, bidang, metode, dll.
Anotasi khusus
Mari kita lihat cara sederhana untuk menggunakan anotasi khusus. Di sini kita pertama kali mendefinisikan 3 anotasi runtime:
// kelas yang berlaku, antarmuka (termasuk jenis anotasi) atau enum @retention (retentionpolicy.runtime) @target (elementType.type) public @interface classInfo {string value (); } // atribut bidang yang berlaku, juga termasuk konstanta enum @retention (retentionpolicy.runtime) @target (elementType.field) public @interface fieldInfo {int [] value (); } // metode yang berlaku @retention (retentionPolicy.runtime) @target (elementType.method) public @interface MethodInfo {string name () default "long"; String data (); int usia () default 27; }Ketiga anotasi ini berlaku untuk elemen yang berbeda dan semuanya memiliki atribut yang berbeda. Saat menggunakan anotasi, Anda perlu mengatur nilai atribut ini.
Tentukan kelas tes lain untuk menggunakan anotasi ini:
/*** anotasi runtime uji*/@classInfo ("Test Class") Public Class TestRunTimeanNotation {@FieldInfo (value = {1, 2}) Public String fieldInfo = "FileDInfo";@fieldInfo (value = {10086}) public int i = 100; @methodinfo (value = {10086}) public int i = 100; @methodinfo (value = {10086}) public int i = 100; @methodinfo (value = {10086}) public int getMethodInfo () {return testruntimeannotation.class.getsimplename ();}}Ini masih sangat mudah digunakan. Akhirnya, mari kita lihat cara mendapatkan informasi anotasi dalam kode:
/*** anotasi runtime uji*/private void _testruntimeannotation () {StringBuffer SB = New StringBuffer (); class <?> Cls = testruntimeannotation.class; konstruktor <?> [] Constructors = cls.getConstructors (); // Dapatkan anotasi dari spesifikasi SPEICEF. ") .Append ("/n "); classInfo classInfo = cls.getAnnotation (classInfo.class); if (classInfo! = null) {sb.append (modifier.tostring (cls.getmodifiers ())). append (" "). letapkan (cls.getpleMPlene ("). Nilai: ") .Append (classInfo.Value ()). append ("/n/n ");} sb.append (" anotasi lapangan: ") .append ("/n "); field [] fields = cls.getDecledFields (); for (field field: fields) {fieldInfo fieldinfo. (fieldInfo! = null) {sb.append (modifier.toString (field.getModifiers ())). append ("") .append (field.getType (). getsImplename ()). append ("") .append (field.getName ()). append ("/n"); ") .Append (arrays.tostring (fieldInfo.value ())). append ("/n/n ");}} sb.append (" Metode anotasi: ") .append ("/n "); Metode [] Metode = cls.getDeClaredMethods (); untuk (Metode); Metode) {Metode) Metode = CLS.GetDeclaredMethods (); untuk metode (Metode) {clsgetDeclaredMethods (); for Method: for Method: for Method) method.getAnnotation (methodInfo.class); if (methodInfo! = null) {sb.append (modifier.toString (method.getModifiers ())). .Append (method.getName ()). append ("/n"); sb.append ("nilai anotasi:") .append ("/n"); sb.append ("name:") .append (methodInfo.name ()). append ("/n"); sb. lampai ("data: data:" data:) ") .Pelpend (methodInfo.data ()). append ("/n "); sb.append (" usia: ") .append (methodInfo.age ()). append ("/n ");}} system.out.print (sb.tostring ());}Operasi dilakukan untuk mendapatkan elemen yang sesuai melalui refleksi, kemudian mendapatkan anotasi pada elemen, dan akhirnya mendapatkan nilai atribut dari anotasi.
Mari kita lihat outputnya, di sini saya akan langsung menampilkannya di ponsel saya:
Meringkaskan
Di atas adalah semua penjelasan terperinci tentang konsep dasar anotasi bahasa Java, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!