Аннотации (также известные как метаданные) предоставляют нам формальный способ добавления информации в нашем коде, что позволяет нам использовать эти данные очень удобно в какой -то более поздний момент.
1. Основной синтаксис
Java SE5 имеет три встроенные стандартные аннотации
@Override: указывает, что текущее определение метода будет перезаписать методы в SuperClass. Если вы случайно написали неправильное правописание, или подпись метода не соответствует перезаписному методу, компилятор выпустит сообщение об ошибке.
@Deprecated: Если программист использует аннотированный элемент, компилятор выпустит предупреждающее сообщение
@Supperesswarnings: закройте предупреждающее сообщение о неподходящем компиляторе.
Java SE5 имеет четыре встроенные мета-аннотации
@Target: указывает, где можно использовать эту аннотация. Возможные параметры elementtype включают:
1) Конструктор: утверждение конструктора
2) Поле: объявление домена (включая экземпляры перечисления)
3) local_variable: Объявление локальной переменной
4) Метод: оператор метода
5) Пакет: оператор пакета
6) Параметр: Объявление параметров
7) Тип: класс, интерфейс (включая тип аннотации) или объявление перечисления
@Retention: указывает, на каком уровне сохранить информацию о аннотации. Дополнительные параметры удержанияполитика включают:
1) Источник: аннотация будет отброшена компилятором
2) Класс: аннотации доступны в файлах класса, но будут отброшены виртуальной машиной
3) Время выполнения: виртуальная машина также сохранит аннотации во время выполнения, поэтому информация о аннотации может быть прочитана с помощью механизма отражения.
@Documented: включить эту аннотацию в Javadoc
@Inhyted: Разрешить подклассы унаследовать аннотации в родительских классах большую часть времени, программисты в основном определяют свои собственные аннотации и пишут свои собственные процессоры для их обращения.
Usecase.java
пакет com; импортировать java.lang.annotation.elementtype; Импорт java.lang.annotation.retention; импортировать java.lang.annotation.retentionpolicy; импортировать java.lang.annotation.target; @Target (elementType.method) // Использование для определения того, где будет применяться ваша аннотация, и это применяется в качестве метода // использование для определения, на каком уровне доступна аннотация, в исходном коде (класс) или времени выполнения (время выполнения) @retention (streationPolicy.Runtime) public @Interface usecase {public int id (); public String description () по умолчанию "Нет описания"; } PasswordUtils. Java пакет com; Public Class Passwordsutils {@usecase (id = 47, description = "Пароли должны содержать хотя бы одно числовое") public boolean validatepassword () {return true; } @Usecase (id = 48) public String ecryptpassword (String password) {return пароль; } @Usecase (id = 49, description = "jong_cai") public void showname () {system.out.println ("jong_cai"); }}
2. Напишите процессор аннотации
Если нет инструмента для чтения аннотаций, аннотации не будут более полезными, чем аннотации. В процессе использования аннотаций важной частью является создание и использование аннотационных процессоров. Java SE5 расширяет API механизма отражения, чтобы помочь программистам построить такие инструменты. В то же время он также предоставляет внешний инструмент, который помогает программистам анализировать исходный код Java с аннотациями. Ниже приведен очень простой процессор аннотации, который мы будем использовать для чтения класса паролей и использовать механизм отражения, чтобы найти тег @usecase. Мы предоставляем ему набор значений идентификатора, а затем перечисляют варианты использования, найденные в паролях, а также отсутствующие варианты использования.
Usecasetracker.java package com; импортировать java.lang.reflect.method; импортировать java.util.arraylist; импортировать java.util.collections; импортировать java.util.list; открытый класс usecasetracker {public static void rackusecases (list <Integer> list, class <?> cl) {for (method m: cl.getdeclaredmethods ()) {usecase us = m.getannotation (usecase.class); if (us! = null) {System.out.println ("найденой вариант использования:" + us.id () + "" + us.description ()); list.remove (new Integer (us.id ())); }} for (int i: list) {System.out.println ("Предупреждение: отсутствующий вариант использования-" + i); }} public static void main (string [] args) {list <Integer> list = new ArrayList <Integer> (); Collections.addall (список, 47,48,49,50,51); Trackusecases (List, passwords.class); }}
В этой программе используются два метода отражения: getDeclaredMethods () и getAnnotation (). Они оба принадлежат к интерфейсу AnnotatedElement (класс, метод и поле и другие классы реализуют этот интерфейс). Метод Getannotation () возвращает аннотационный объект указанного типа, который является использованием. Если аннотированный метод не имеет аннотации типа, он возвращает нулевое значение. Затем мы извлекаем значение элемента из возвращаемого объекта usecase, вызывая методы id () и description (). Метод EncryptPassword () не указывает значение описания при аннотировании, поэтому, когда процессор обрабатывает соответствующую аннотацию, значение метода description () получает методом description ().
Аннотация распространяется в мире Явы. Если у вас есть время, напишите эту статью «Простые аннотации». Это введение в аннотацию. Я надеюсь, что вы можете бросить кирпич и учиться вместе ...
Если вы перестанете говорить чушь, практика - это суть.
3. Пример
Давайте сначала поговорим об концепции аннотации, а затем поговорим о том, как создать свою собственную аннотацию.
Во -первых, в пакете java.lang.annotation, который поставляется с JDK, откройте следующие исходные файлы:
Исходный файл target.java
@Documened @retention (armatedpolicy.runtime) @target (elementtype.annotation_type) public @Interface Target {elementType [] value (); @Documened @retention (armatedpolicy.runtime) @target (elementtype.annotation_type) public @Interface Target {elementType [] value (); }
@Interface - это ключевое слово. При проектировании аннотаций тип должен быть определен как @Interface, и вы не можете использовать ключевые слова класса или интерфейс (вы думаете, что солнце немного скучное, но он выглядит так похоже на интерфейс).
Удерживание исходного файла.java
@Documened @retention (armatedpolicy.runtime) @target (elementtype.annotation_type) public @Interface hearpention {arsementPolicy value (); } @Documened @retention (armatedpolicy.runtime) @target (elementtype.annotation_type) public @Interface hearpention {hearmentPolicy value (); }
Увидев это, вы можете быть расплывчатым и не знаете, о чем говорите. Не волнуйся, посмотри. Приведенные выше файлы используют два поля удержания и elementtype, и вы можете догадаться, что это два файла Java. Действительно, исходные коды этих двух файлов следующие:
Исходный файл harementpolicy.java
public enum arsementpolicy {источник, класс, время выполнения} public enum arsementpolicy {источник, класс, время выполнения} Это тип перечисления, с тремя значениями, а именно источником, классом и времени выполнения.
Источник означает, что информация о типе аннотации будет сохранена только в исходном коде программы. Если исходный код будет составлен, данные аннотации исчезнут и не будут сохранены в скомпилированном файле .class.
Класс означает, что информация о типе аннотации сохраняется в исходном коде программы, а также будет сохранена в скомпилированном файле .class. При выполнении эта информация не будет загружена в виртуальную машину (JVM). Обратите внимание, что когда вы не устанавливаете значение задержки типа аннотации, значение по умолчанию системы является классом.
Третье - время выполнения, что означает, что информация сохраняется в исходном коде и скомпилированном.
Например, если удержание в @Override установлено на источник, если компиляция успешна, вам не нужна эта проверенная информация; Напротив, удержание в @deprecated установлено для времени выполнения, что означает, что в дополнение к предупреждению, какой метод используется во время компиляции, вы также можете проверить, не зависит ли метод при выполнении.
Исходный файл elementtype.java
public enum elementtype {type, поле, метод, параметр, конструктор, local_variable, annotation_type, пакет} public enum elementtype {type, поле, метод, параметр, конструктор, local_variable, annotation_type, пакет} @ elementtype в цели используется для указания того, какой тип аннотации может быть использован. Давайте объясним: Type (type), Field (атрибут), метод (метод), параметр (параметр), конструктор (конструктор), local_variable (локальная переменная), Annotation_type, пакет (пакет), где тип (тип) относится к ней, используемой в классе, интерфейсе, перечислении и типах аннотаций.
Кроме того, из исходного кода 1 можно увидеть, что сам @Target также использовал себя, чтобы объявить себя и может использоваться только на Annotation_type.
Если тип аннотации не указывает, какие элементы используются @Target, его можно использовать на любом элементе, а элемент здесь относится к вышеуказанным типам.
Позвольте мне привести несколько правильных примеров:
@Target (elementType.method)
@Target (value = elementType.method)
@Target (elementtype.method, elementtype.constructor)
Пожалуйста, обратитесь к документации Javadoc для получения подробной информации
Исходные файлы все используют @documented. Цель @documented - включить информацию о типе аннотации в документе описания Javaapi; Если это не добавлено, информация, сгенерированная этим типом, не будет найдена при использовании Javadoc для генерации документа API.
Другой момент заключается в том, что если вам нужно унаследовать данные аннотации в подкласс, вы будете использовать тип аннотации @inted.
Ниже приведен самый простой пример аннотации для проектирования, который состоит из четырех файлов;
Описание. Ява
пакет Ligher.javaeye.com; импортировать java.lang.annotation.documented; импортировать java.lang.annotation.elementtype; Импорт java.lang.annotation.retention; импортировать java.lang.annotation.retentionpolicy; импортировать java.lang.annotation.target; @Target (elementType.type) @retention (hestentionpolicy.runtime) @documented public @Interface description {string value (); } упаковка Ligher.javaeye.com; импортировать java.lang.annotation.documented; импортировать java.lang.annotation.elementtype; Импорт java.lang.annotation.retention; импортировать java.lang.annotation.retentionpolicy; импортировать java.lang.annotation.target; @Target (elementType.type) @retention (hestentionpolicy.runtime) @documented public @Interface description {string value (); }
ПРИМЕЧАНИЕ. Все аннотации автоматически наследуют интерфейс java.lang.annotation, поэтому вы не можете наследовать другие классы или интерфейсы.
Наиболее важным моментом является то, как установить параметры в типе аннотации:
Во -первых, вы можете использовать только публичные права или права по умолчанию, чтобы изменить его. Например, String value (); Здесь установите метод по умолчанию типа по умолчанию.
Во -вторых, элементы параметров могут использовать только восемь основных типов данных: байт, короткий, char, int, long, float, двойной, логический и типы данных, такие как строка, enum, класс, аннотации, а также массивы этих типов. Например, String value (); Участник параметра здесь является строкой.
В -третьих, если есть только один элемент параметра, лучше всего установить имя параметра в «Значение», а потом добавить скобки. Пример: приведенный выше пример имеет только один элемент параметра.
Name.java
пакет Ligher.javaeye.com; импортировать java.lang.annotation.documented; импортировать java.lang.annotation.elementtype; Импорт java.lang.annotation.retention; импортировать java.lang.annotation.retentionpolicy; импортировать java.lang.annotation.target; // Обратите внимание, что @Target здесь отличается от @Description, и члены параметров также разные @Target (elementType.method) @retention (armentpolicy.runtime) @documented public @Interface name {string ony (); String Community (); } упаковка Ligher.javaeye.com; импортировать java.lang.annotation.documented; импортировать java.lang.annotation.elementtype; Импорт java.lang.annotation.retention; импортировать java.lang.annotation.retentionpolicy; импортировать java.lang.annotation.target; // Обратите внимание, что @Target здесь отличается от @Description, и члены параметров также разные @Target (elementType.method) @retention (armentpolicy.runtime) @documented public @Interface name {string ony (); String Community (); }
Javaeyer.java
пакет Ligher.javaeye.com; @Description ("javaeye, быть лучшим сообществом по обмену программным обеспечением") открытый класс Javaeyer {@name (orin = "Основатель: Robbin", Community = "javaeye") public String getName () {return null; } @Name (orinination = "Основатель: Jiangnan Baiyi", сообщество = "Springside") public String getName2 () {return "заимствует два идентификатора идентификаторов, пожалуйста, простите меня за написание этого примера!"; }} упаковка LIGER.Javaeye.com; @Description ("javaeye, быть лучшим сообществом по обмену программным обеспечением") открытый класс Javaeyer {@name (orin = "Основатель: Robbin", Community = "javaeye") public String getName () {return null; } @Name (orinination = "Основатель: Jiangnan Baiyi", сообщество = "Springside") public String getName2 () {return "заимствует два идентификатора идентификаторов, пожалуйста, простите меня за написание этого примера!"; }}Напишите класс проверки, который может запустить информацию об вытяжении Javaeyer
пакет Ligher.javaeye.com; импортировать java.lang.reflect.method; импортировать java.util.hashset; импортировать java.util.set; Общественный класс Testannotation { / *** Автор легче* Примечание: для получения подробной информации, пожалуйста, см. Документацию Javadoc для использования API аннотации* / public static void main (string [] args), бросает исключение {String class_name = "lighter.javaeye.com.javaeyer"; Class test = class.forname (class_name); Method [] method = test.getMethods (); Boolean Flag = test.isannotationpresent (description.class); if (flag) {описание des = (description) test.getannotation (description.class); System.out.println ("Описание:"+des.value ()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Hashset <Method> (); System.out.println ("Созданный сообщество:"+name.community ()); Annotation api*/ public static void main (string [] args) выбрасывает исключение {String class_name = "lighter.javaeye.com.javaeyer"; Class test = class.forname (class_name); Method [] method = test.getMethods (); Boolean Flag = test.isannotationpresent (description.class); if (flag) {описание des = (description) test.getannotation (description.class); System.out.println ("Описание:"+des.value ()); System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { BOOLEN OtherFlag = Method [i]. Результаты работы:
Описание: Javaeye, лучший сообщество по обмену программного обеспечения Основатель: Роббин создал сообщество: Javaeye Основатель: Javaeye Создал сообщество: Springside