Adakah yang bisa menjelaskan kepada saya bagaimana anotasi bekerja secara internal di java?
Saya tahu bagaimana kita bisa membuat anotasi kustom dengan menggunakan perpustakaan java.lang.annotation di java. Tapi saya masih belum mengerti cara kerjanya secara internal misalnya, anotasi @Override.
Saya akan sangat berterima kasih jika ada yang bisa menjelaskannya secara detail.
java
annotations
Chirag Dasani
sumber
sumber
Jawaban:
Perbedaan utama pertama antara jenis anotasi adalah apakah anotasi digunakan pada waktu kompilasi dan kemudian dibuang (suka
@Override
) atau ditempatkan di file kelas yang dikompilasi dan tersedia saat runtime (seperti Spring@Component
). Ini ditentukan oleh kebijakan @Retensi anotasi. Jika Anda menulis anotasi Anda sendiri, Anda harus memutuskan apakah anotasi berguna pada waktu proses (untuk konfigurasi otomatis, mungkin) atau hanya pada waktu kompilasi (untuk pemeriksaan atau pembuatan kode).Saat mengompilasi kode dengan anotasi, kompilator melihat anotasi seperti ia melihat pengubah lain pada elemen sumber, seperti pengubah akses (
public
/private
) ataufinal
. Saat menemukan anotasi, ia menjalankan pemroses anotasi, yang seperti kelas plug-in yang mengatakan tertarik pada anotasi tertentu. Pemroses anotasi umumnya menggunakan API Refleksi untuk memeriksa elemen yang sedang dikompilasi dan dapat dengan mudah menjalankan pemeriksaan pada mereka, memodifikasinya, atau menghasilkan kode baru untuk dikompilasi.@Override
adalah contoh yang pertama; ia menggunakan API Refleksi untuk memastikannya dapat menemukan kecocokan untuk tanda tangan metode di salah satu kelas super dan menggunakanMessager
untuk menyebabkan kesalahan kompilasi jika tidak bisa.Ada sejumlah tutorial yang tersedia tentang menulis pemroses anotasi; inilah yang berguna . Melihat melalui metode di dalam
Processor
antarmuka untuk bagaimana compiler memanggil prosesor penjelasan; operasi utama berlangsung dalamprocess
metode, yang dipanggil setiap kali kompilator melihat elemen yang memiliki anotasi yang cocok.sumber
Selain apa yang disarankan orang lain, saya sarankan Anda menulis anotasi yang disesuaikan dan prosesornya dari awal untuk melihat cara kerja anotasi.
Di saya sendiri, misalnya, saya telah menulis anotasi untuk memeriksa apakah metode kelebihan beban dalam waktu kompilasi.
Pertama, buat anotasi bernama
Overload
. Anotasi ini diterapkan ke metode jadi saya menganotasinya dengan@Target(value=ElementType.METHOD)
package gearon.customAnnotation; import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(value=ElementType.METHOD) public @interface Overload { }
Selanjutnya, buat prosesor yang sesuai untuk menangani elemen yang dianotasi oleh anotasi yang ditentukan. Untuk metode yang diberi anotasi
@Overload
, tanda tangannya harus muncul lebih dari satu kali. Atau kesalahan dicetak.package gearon.customAnnotation; import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic.Kind; @SupportedAnnotationTypes("gearon.customAnnotation.Overload") public class OverloadProcessor extends AbstractProcessor{ @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { // TODO Auto-generated method stub HashMap<String, Integer> map = new HashMap<String, Integer>(); for(Element element : roundEnv.getElementsAnnotatedWith(Overload.class)){ String signature = element.getSimpleName().toString(); int count = map.containsKey(signature) ? map.get(signature) : 0; map.put(signature, ++count); } for(Entry<String, Integer> entry: map.entrySet()){ if(entry.getValue() == 1){ processingEnv.getMessager().printMessage(Kind.ERROR, "The method which signature is " + entry.getKey() + " has not been overloaded"); } } return true; } }
Setelah memaketkan anotasi dan prosesnya menjadi file jar, buat kelas dengan
@Overload
dan gunakan javac.exe untuk mengkompilasinya.import gearon.customAnnotation.Overload; public class OverloadTest { @Overload public static void foo(){ } @Overload public static void foo(String s){ } @Overload public static void nonOverloadedMethod(){ } }
Karena
nonOverloadedMethod()
belum benar-benar kelebihan beban, kita akan mendapatkan keluaran seperti di bawah ini:sumber
OverloadProcessor::process
kenapaentry.getValue() == 1
? Seseorang tidak perlu menambahkan anotasi di kelas / antarmuka induk, jadiroundEnv.getElementsAnnotatedWith(Overload.class)
tidak akan mendapatkan kelas / antarmuka induk, bukan?Berikut
@Override
: http://www.docjar.com/html/api/java/lang/Override.java.html .Tidak ada yang istimewa tentangnya yang membedakannya dari anotasi yang mungkin Anda tulis sendiri. Bit yang menarik ada di konsumen anotasi. Untuk anotasi seperti
@Override
, itu akan ada di compiler Java itu sendiri, atau alat analisis kode statis, atau IDE Anda.sumber
@Override
(atau anotasi standar lainnya).Pada dasarnya anotasi hanyalah penanda yang dibaca oleh kompilator atau aplikasi. Bergantung pada kebijakan retensinya, mereka tersedia pada waktu kompilasi saja atau dapat dibaca pada waktu proses menggunakan refleksi.
Banyak kerangka kerja menggunakan retensi waktu proses, yaitu mereka secara reflektif memeriksa apakah beberapa anotasi ada di kelas, metode, bidang, dll. Dan melakukan sesuatu jika anotasi ada (atau tidak). Selain itu, anggota anotasi dapat digunakan untuk menyampaikan informasi lebih lanjut.
sumber
Ikuti tautan ini . Ini akan memberikan jawaban dekat untuk masalah Anda. Jika kita berfokus pada anotasi di
Java
, Anotasi diperkenalkan di Java 5 dan bukan khusus Spring. Secara umum, anotasi memungkinkan Anda menambahkan metadata ke kelas, metode, atau variabel. Anotasi dapat diinterpretasikan oleh kompilator (misalnya, anotasi @Override) atau oleh kerangka kerja seperti pegas (misalnya, anotasi @Component).Selain itu saya menambahkan lebih banyak referensi.
sumber
Bahkan saya mencari jawaban dari pertanyaan yang sama. tautan di bawah ini menyediakan hal-hal bagus yang terkonsolidasi untuk mendapatkan bagian dalam anotasi. https://dzone.com/articles/how-annotations-work-java Semoga membantu!
sumber