1. harementpolicy.source: аннотация сохраняется только в исходном файле. Когда файл Java составлен в файл класса, аннотация остается заброшенной;
2. harementpolicy.class: аннотация сохраняется в файле класса, но заброшена, когда JVM загружает файл класса. Это жизненный цикл по умолчанию;
3. streationPolicy.Runtime: аннотация не только сохраняется в файле класса, но и все еще существует после того, как JVM загружает файл класса;
Эти три жизненного цикла соответствуют: исходному файлу Java (.java file) --->. Файл класса ----> Bytecode в памяти.
Итак, как вы выбираете правильный жизненный цикл аннотации?
Прежде всего, мы должны уточнить источник длины жизненного цикла <класс <класс <время выполнения, поэтому, где первый может действовать, последний может действовать. Как правило, если вам нужно динамически получать информацию о аннотации во время выполнения, вы можете использовать только аннотацию времени выполнения; Если вы хотите выполнить некоторые операции предварительной обработки во время компиляции, например, генерирование некоторого вспомогательного кода (например, Butter Knife), вы можете использовать классовую аннотацию; Если вы выполняете только некоторые проверки, такие как @Override и @SuppressWarnings, вы можете использовать аннотацию источника.
Ниже приведено простое применение аннотаций времени выполнения.
Получите аннотацию
Вам необходимо получить аннотации времени выполнения посредством отражения, которые могут быть получены из пакета, класса, поля, метода .... Основные методы одинаковы. Несколько общих методов следующие:
/*** Получите аннотацию указанного типа*/public <A Extends Annotation> A Getannotation (класс <a> AnnotationType);/*** Получить все аннотации, если вообще*/Public Annotation [] getAnnotations ();/*** Получите все аннотации, игнорируют уникальные аннотации*/public annotation [] getDeclations (Bestoration*/**/Public annotation (]. Существует в этом элементе, верните True, если есть, иначе False*/public Boolean IsannotationPresent (класс <? Extends Annotation> AnnotationType);/***Получить все аннотации для параметров в методе*/public Annotation [] [] getParameterantationations ();
Чтобы использовать эти функции, сначала необходимо получить соответствующие элементы посредством отражения: класс, поле, метод и т. Д.
Пользовательские аннотации
Давайте посмотрим на простой способ использовать пользовательские аннотации. Здесь мы сначала определили 3 аннотации времени выполнения:
// Применимый класс, интерфейс (включая тип аннотации) или enum @retention (armentpolicy.runtime) @target (elementtype.type) public @Interface classInfo {String value (); } // Применимые атрибуты поля также включают константы enum @retention (armentpolicy.runtime) @target (elementtype.field) public @Interface fieldInfo {int [] value (); } // Применимый метод @retention (armentpolicy.runtime) @target (elementtype.method) public @Interface methodInfo {string name () по умолчанию "long"; String Data (); int age () по умолчанию 27; }Эти три аннотации применимы к разным элементам, и все имеют разные атрибуты. При использовании аннотаций вам необходимо установить эти значения атрибутов.
Определите другой тестовый класс для использования этих аннотаций:
/*** Аннотация времени выполнения тестирования*/@classinfo ("test class") открытый класс testruntimeannotation {@fieldinfo (value = {1, 2}) public String fieldfo = "filedinfo";@fieldinfo (value = {10086}) public int i = 100; @methodinfo (name = strice strice ")") getmethodinfo () {return testruntimeannotation.class.getSimplename ();}}Это все еще очень просто в использовании. Наконец, давайте посмотрим, как получить информацию о аннотации в коде:
/*** Аннотация времени выполнения теста*/private void _testruntimeannotation () {stringbuffer sb = new Stringbuffer (); class <?> Cls = testruntimeannotation.class; конструктор <?> [] Constructors = cls.getConstructors (); // Получить аннотация указанного типа SB.Append (); ") .append ("/n "); classinfo classinfo = cls.getannotation (classinfo.class); if (classinfo! Значение: ") .append (classInfo.value ()). Append ("/n/n ");} sb.append (" Полевой аннотация: ") .append ("/n "); Field [] fields = cls.getDeclaredFields (); для (поле: Fields) {fieldInfo wieldfo = fieldantation (field offoss. (FieldInfo! = null) {sb.Append (modifier.toString (field.getModifiers ())). Append ("") .append (field.getType (). getSiMplename ()). Append ("") .append (field.getName ().). Append ("/n"); ") .append (Arrays.toString (fieldInfo.value ())). Append ("/n/n ");}} sb.append (" Метод аннотация: ") .append ("/n "); Метод = Cls.getDeclaredMethods (); для (метод метод: метод) {метод? method.getannotation (methodInfo.class); if (methodInfo! = null) {sb.append (modifier.toString (method.getModifiers ())). Приложение ("") .append (method.getReturnType (). getSiMplename ()). .append (method.getName ()). Append ("/n"); Sb.Append ("значение аннотации:") .append ("/n"); sb.append ("name:") .append (methodInfo.name ()). Append ("/n"); Sb.Append ("Data: ") .append (methodInfo.data ()). Append ("/n "); sb.Append (" age: ") .append (methodInfo.age ()). Append ("/n ");}} System.out.print (sb.toString ();"Операции выполняются для получения соответствующего элемента посредством отражения, затем получить аннотацию на элементе и, наконец, получить значение атрибута аннотации.
Давайте посмотрим на вывод, здесь я буду напрямую отобразить его на своем телефоне:
Суммировать
Выше приведено все подробное объяснение основных концепций аннотации языка Java, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!