Herkes net bir şekilde arasındaki pratik farklılıkları açıklayabilir java.lang.annotation.RetentionPolicy
sabitler SOURCE
, CLASS
ve 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.RetentionPolicy
sabitler SOURCE
, CLASS
ve 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
apt
kaldı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.Method
ve 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 javap
bunu gözlemlemek Retention.CLASS
açıklamalı sınıf bir alır RuntimeInvisible class özelliği:
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
ise Retention.RUNTIME
ek açıklama bir alır RuntimeVisible class özelliği:
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
ve Runtime.SOURCE
ek açıklama ek açıklama .class
almaz.
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.