Может кто - нибудь объяснить , в ясной форме практических различий между java.lang.annotation.RetentionPolicy
константами SOURCE
, CLASS
и RUNTIME
?
Я также не совсем уверен, что означает фраза «сохранение аннотации».
java
annotations
xdevel2000
источник
источник
Ответы:
Источник: старый URL мертв, теперь
hunter_metaи заменен на hunter-meta-2-098036 . В случае, если даже это не работает, я загружаю изображение страницы.Изображение (щелкните правой кнопкой мыши и выберите «Открыть изображение в новой вкладке / окне»)
источник
RetentionPolicy.CLASS
apt
это устарело, обратитесь к этому docs.oracle.com/javase/7/docs/technotes/guides/apt/… . Для обнаружения аннотации с помощью рефлексии в Интернете есть несколько учебных пособий. Вы можете начать с изученияjava.lang.Class::getAnno*
и аналогичных методов вjava.lang.reflect.Method
иjava.lang.reflect.Field
.Согласно вашим комментариям о декомпиляции классов, вот как я думаю, что это должно работать:
RetentionPolicy.SOURCE
: Не появится в декомпилированном классеRetentionPolicy.CLASS
: Появляются в декомпилированном классе, но не могут быть проверены во время выполнения с отражениемgetAnnotations()
RetentionPolicy.RUNTIME
: Появляются в декомпилированном классе и могут быть проверены во время выполнения с помощьюgetAnnotations()
источник
Минимальный исполняемый пример
Уровень языка :
Уровень байт-кода : при использовании
javap
мы видим, чтоRetention.CLASS
аннотированный класс получает атрибут класса RuntimeInvisible :в то время как
Retention.RUNTIME
аннотация получает атрибут класса RuntimeVisible :и
Runtime.SOURCE
аннотированный.class
не получает никаких аннотаций.Примеры на GitHub для вас, чтобы играть с.
источник
Политика хранения. Политика хранения определяет, в какой момент аннотация отклоняется. Это указывается с помощью встроенных аннотаций Java:
@Retention
[About]источник
Oracle Doc
источник