Herkes net bir şekilde arasındaki pratik farklılıkları açıklayabilir java.lang.annotation.RetentionPolicysabitler SOURCE, CLASSve RUNTIME?
Ayrıca, "ek açıklama tutma" ifadesinin ne anlama geldiğinden tam olarak emin değilim.
Herkes net bir şekilde arasındaki pratik farklılıkları açıklayabilir java.lang.annotation.RetentionPolicysabitler SOURCE, CLASSve RUNTIME?
Ayrıca, "ek açıklama tutma" ifadesinin ne anlama geldiğinden tam olarak emin değilim.
Yanıtlar:
RetentionPolicy.SOURCE: Derleme sırasında atın. Derleme tamamlandıktan sonra bu ek açıklamalar bir anlam ifade etmez, bu nedenle bayt koduna yazılmaz.
Örnek:@Override,@SuppressWarnings
RetentionPolicy.CLASS: Sınıf yükü sırasında atın. Bayt kodu düzeyinde son işlem yaparken kullanışlıdır. Biraz şaşırtıcı bir şekilde, bu varsayılan değerdir.
RetentionPolicy.RUNTIME: Atmayın. Ek açıklama çalışma zamanında yansıtılmak üzere hazır olmalıdır. Misal:@Deprecated
Kaynak:
Eski URL artık öldü
hunter_meta ve yerine hunter-meta-2-098036 yerleştirildi . Bu bile düşerse, sayfanın görüntüsünü yüklüyorum.
Görüntü (Sağ Tıklayın ve 'Görüntüyü Yeni Sekmede / Pencerede Aç' ı seçin)

RetentionPolicy.CLASS
aptkaldırılmış olsa da bu docs.oracle.com/javase/7/docs/technotes/guides/apt/… adresine bakın . Yansımayı kullanarak ek açıklama keşfetmek için internette birden fazla öğretici vardır. Sen içine bakarak başlayabilirsiniz java.lang.Class::getAnno*ve benzer yöntemlerle java.lang.reflect.Methodve java.lang.reflect.Field.
Sınıf ayrışması hakkındaki yorumlarınıza göre, bunun nasıl çalışması gerektiğini düşünüyorum:
RetentionPolicy.SOURCE: Ayrıştırılmış sınıfta görünmeyecek
RetentionPolicy.CLASS: Ayrıştırılmış sınıfta görünür, ancak çalışma zamanında yansıma ile denetlenemez. getAnnotations()
RetentionPolicy.RUNTIME: Ayrıştırılmış sınıfta görünür ve çalışma zamanında yansıma ile denetlenebilir getAnnotations()
Minimum çalıştırılabilir örnek
Dil seviyesi :
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionSource
class B {}
assert B.class.getAnnotations().length == 0;
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
Bytecode seviyesi : kullanarak javapbunu gözlemlemek Retention.CLASSaçıklamalı sınıf bir alır RuntimeInvisible class özelliği:
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
ise Retention.RUNTIMEek açıklama bir alır RuntimeVisible class özelliği:
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
ve Runtime.SOURCEek açıklama ek açıklama .classalmaz.
Saklama Politikası: Saklama politikası, ek açıklamanın hangi noktada atılacağını belirler. Java'nın yerleşik ek açıklamaları kullanılarak belirtilir: @Retention[Hakkında]
1.SOURCE: annotation retained only in the source file and is discarded
during compilation.
2.CLASS: annotation stored in the .class file during compilation,
not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.