Siapa pun dapat menjelaskan dengan cara yang jelas perbedaan praktis antara java.lang.annotation.RetentionPolicy
konstanta SOURCE
, CLASS
dan RUNTIME
?
Saya juga tidak yakin apa arti frasa "mempertahankan anotasi".
java
annotations
xdevel2000
sumber
sumber
Jawaban:
Sumber: URL lama sudah mati sekarang
hunter_metadan diganti dengan hunter-meta-2-098036 . Seandainya ini turun, saya mengunggah gambar halaman.Gambar (Klik Kanan dan Pilih 'Buka Gambar di Tab / Jendela Baru')
sumber
RetentionPolicy.CLASS
apt
sudah usang, lihat dokumen inis.oracle.com/javase/7/docs/technotes/guides/apt/… . Untuk menemukan anotasi menggunakan refleksi ada beberapa tutorial di internet. Anda dapat mulai dengan melihatjava.lang.Class::getAnno*
dan metode serupa di dalamjava.lang.reflect.Method
danjava.lang.reflect.Field
.Menurut komentar Anda tentang dekompilasi kelas, berikut ini menurut saya cara kerjanya:
RetentionPolicy.SOURCE
: Tidak akan muncul di kelas yang didekompilasiRetentionPolicy.CLASS
: Tampil di kelas yang didekompilasi, tetapi tidak dapat diperiksa pada saat run-time dengan refleksi dengangetAnnotations()
RetentionPolicy.RUNTIME
: Tampil di kelas yang didekompilasi, dan dapat diperiksa pada saat dijalankan dengan refleksi bersamagetAnnotations()
sumber
Contoh runnable minimal
Tingkat bahasa :
Level bytecode : menggunakan
javap
kami amati bahwaRetention.CLASS
kelas yang diberi catatan mendapat atribut kelas RuntimeInvisible :sementara
Retention.RUNTIME
anotasi mendapat atribut kelas RuntimeVisible :dan
Runtime.SOURCE
anotasi.class
tidak mendapatkan anotasi.Contoh di GitHub untuk Anda mainkan.
sumber
Kebijakan Retensi: Kebijakan retensi menentukan pada titik mana anotasi dibuang. Ini ditentukan menggunakan anotasi bawaan Java:
@Retention
[Tentang]sumber
Oracle Doc
sumber