Czy ktoś może wyjaśnić w jasny sposób praktycznych różnic między java.lang.annotation.RetentionPolicy
stałymi SOURCE
, CLASS
i RUNTIME
?
Nie jestem też do końca pewien, co oznacza wyrażenie „zachowanie adnotacji”.
java
annotations
xdevel2000
źródło
źródło
Odpowiedzi:
Źródło: stary adres URL jest teraz martwy
hunter_metai zastąpiony przez hunter-meta-2-098036 . Na wypadek, gdyby to się zdarzyło, przesyłam obraz strony.Obraz (kliknij prawym przyciskiem myszy i wybierz „Otwórz obraz w nowej karcie / oknie”)
źródło
RetentionPolicy.CLASS
apt
jest przestarzały, zapoznaj się z tym docs.oracle.com/javase/7/docs/technotes/guides/apt/… . W Internecie dostępnych jest wiele samouczków do odkrywania adnotacji za pomocą refleksji. Możesz zacząć od przyjrzenia sięjava.lang.Class::getAnno*
i podobnym metodom wjava.lang.reflect.Method
ijava.lang.reflect.Field
.Zgodnie z twoimi komentarzami na temat dekompilacji klas, oto jak myślę, że powinno to działać:
RetentionPolicy.SOURCE
: Nie pojawi się w zdekompilowanej klasieRetentionPolicy.CLASS
: Pojawiają się w zdekompilowanej klasie, ale nie można ich sprawdzić w czasie wykonywania za pomocą odbicia zgetAnnotations()
RetentionPolicy.RUNTIME
: Pojawiają się w zdekompilowanej klasie i można je sprawdzić w czasie wykonywania za pomocą refleksji za pomocągetAnnotations()
źródło
Minimalny przykład do uruchomienia
Poziom języka :
Poziom kodu bajtowego : używając
javap
obserwujemy, żeRetention.CLASS
klasa z adnotacjami otrzymuje atrybut klasy RuntimeInvisible :podczas gdy
Retention.RUNTIME
adnotacja pobiera atrybut klasy RuntimeVisible :a
Runtime.SOURCE
adnotacja.class
nie otrzymuje adnotacji.Przykłady na GitHub, z którymi możesz się bawić.
źródło
Zasady przechowywania: zasady przechowywania określają, w którym momencie adnotacja jest odrzucana. Jest to określone za pomocą wbudowanych adnotacji Java:
@Retention
[Informacje]źródło
Oracle Doc
źródło