Автор оригинала: Pankaj Kumar.
Аннотации Java предоставляют информацию о коде. Аннотации Java не оказывают прямого влияния на код, который они аннотируют. В учебнике по аннотациям java мы рассмотрим следующее;
- Встроенные аннотации Java
- Как написать пользовательскую аннотацию
- Использование аннотаций и как анализировать аннотации с помощью API отражения .
Аннотации Java
В Java 1.5 появились аннотации, и теперь они широко используются в Java EE-фреймворках , таких как Hibernate, Jersey и Spring .
Аннотация Java – это метаданные о программе, встроенные в саму программу. Он может быть проанализирован инструментом анализа аннотаций или компилятором. Мы также можем указать доступность аннотаций либо только во время компиляции, либо до времени выполнения.
До аннотаций java метаданные программы были доступны через комментарии java или с помощью Javadoc, но аннотации предлагают больше, чем это. Метаданные аннотаций также могут быть доступны во время выполнения, и анализаторы аннотаций могут использовать их для определения потока процесса.
Например, в веб-сервисе Jersey мы добавляем аннотацию ПУТИ со строкой URI к методу, и во время выполнения jersey анализирует ее, чтобы определить метод для вызова для данного шаблона URI.
Пользовательские аннотации Java
Создание пользовательской аннотации похоже на написание интерфейса, за исключением того, что ключевое слово интерфейса имеет префикс @ символ. Мы можем объявить методы в аннотации.
Давайте рассмотрим пример пользовательских аннотаций java, а затем обсудим его особенности и важные моменты.
package com.journaldev.annotations; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Target(ElementType.METHOD) @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface MethodInfo{ String author() default "Pankaj"; String date(); int revision() default 1; String comments(); }
Некоторые важные моменты, касающиеся аннотаций java, заключаются в следующем:
- Методы аннотаций не могут иметь параметров.
- Методы аннотации возвращаемые типы ограничены примитивами, Строками, перечислениями, аннотациями или массивами из них.
- Методы аннотаций Java могут иметь значения по умолчанию.
- К аннотациям могут быть прикреплены мета-аннотации. Мета-аннотации используются для предоставления информации об аннотации.
Мета-аннотации на java
Существует пять типов мета-аннотаций:
- @Documented – указывает, что элементы, использующие эту аннотацию, должны быть задокументированы javadoc и аналогичными инструментами. Этот тип следует использовать для аннотирования объявлений типов, аннотации которых влияют на использование аннотированных элементов их клиентами. Если объявление типа снабжено аннотациями с документацией, его аннотации становятся частью общедоступного API аннотированных элементов.
- @Target – указывает типы программных элементов, к которым применим тип аннотации. Некоторые возможные значения-ТИП, МЕТОД, КОНСТРУКТОР, ПОЛЕ и т.д. Если целевая мета-аннотация отсутствует, то аннотацию можно использовать для любого элемента программы.
- @Унаследовано – указывает, что тип аннотации автоматически наследуется. Если пользователь запрашивает тип аннотации в объявлении класса, а в объявлении класса нет аннотации для этого типа, то суперкласс класса автоматически запрашивается для типа аннотации. Этот процесс будет повторяться до тех пор, пока не будет найдена аннотация для этого типа или не будет достигнута вершина иерархии классов (Объект).
- @Retention – указывает, как долго должны сохраняться аннотации с аннотированным типом. Он принимает аргумент RetentionPolicy, возможными значениями которого являются ИСТОЧНИК, КЛАСС и ВРЕМЯ выполнения
- @Repeatable – используется для указания на то, что тип аннотации, объявление которой он аннотирует, является повторяемым.
Встроенные аннотации на Java
Java предоставляет пять встроенных аннотаций.
@Override
– Когда мы хотим переопределить метод суперкласса, мы должны использовать эту аннотацию, чтобы сообщить компилятору, что мы переопределяем метод. Поэтому, когда метод суперкласса удаляется или изменяется, компилятор покажет сообщение об ошибке. Узнайте, почему мы всегда должны использовать аннотацию переопределения java при переопределении метода.@Устаревший
– когда мы хотим, чтобы компилятор знал, что метод устарел, мы должны использовать эту аннотацию. Java рекомендует, чтобы в javadoc мы предоставили информацию о том, почему этот метод устарел и какова альтернатива его использованию.@SuppressWarnings
– Это просто для того, чтобы указать компилятору игнорировать определенные предупреждения, которые они выдают, например, с использованием необработанных типов в java generics . Его политика хранения является ИСХОДНОЙ, и компилятор отбрасывает ее.@Functional interface
– Эта аннотация была введена в Java 8 , чтобы указать, что интерфейс предназначен для функционального интерфейса .@SafeVarargs
– Утверждение программиста о том, что тело аннотированного метода или конструктора не выполняет потенциально небезопасных операций с его параметром varargs.
Пример аннотаций Java
Давайте рассмотрим пример java, показывающий использование встроенных аннотаций в java, а также использование пользовательских аннотаций, созданных нами в приведенном выше примере.
package com.journaldev.annotations; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; public class AnnotationExample { public static void main(String[] args) { } @Override @MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 1) public String toString() { return "Overriden toString method"; } @Deprecated @MethodInfo(comments = "deprecated method", date = "Nov 17 2012") public static void oldMethod() { System.out.println("old method, don't use it."); } @SuppressWarnings({ "unchecked", "deprecation" }) @MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 10) public static void genericsTest() throws FileNotFoundException { List l = new ArrayList(); l.add("abc"); oldMethod(); } }
Я считаю, что приведенный выше пример аннотации java понятен и показывает использование аннотаций в разных случаях.
Синтаксический анализ аннотаций Java
Мы будем использовать отражение для анализа аннотаций java из класса. Пожалуйста, обратите внимание, что Политика хранения аннотаций должна быть ВО время выполнения в противном случае ее информация не будет доступна во время выполнения, и мы не сможем извлечь из нее какие-либо данные.
package com.journaldev.annotations; import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class AnnotationParsing { public static void main(String[] args) { try { for (Method method : AnnotationParsing.class.getClassLoader() .loadClass(("com.journaldev.annotations.AnnotationExample")).getMethods()) { // checks if MethodInfo annotation is present for the method if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) { try { // iterates all the annotations available in the method for (Annotation anno : method.getDeclaredAnnotations()) { System.out.println("Annotation in Method '" + method + "' : " + anno); } MethodInfo methodAnno = method.getAnnotation(MethodInfo.class); if (methodAnno.revision() == 1) { System.out.println("Method with revision no 1 = " + method); } } catch (Throwable ex) { ex.printStackTrace(); } } } } catch (SecurityException | ClassNotFoundException e) { e.printStackTrace(); } } }
Результатом работы вышеуказанной программы является:
Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012) Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString() Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated() Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012) Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod() Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)
API отражения очень мощный и широко используется в Java, фреймворках J2EE, таких как Spring, Hibernate , JUnit, проверьте Отражение в Java .
Это все для примера учебника по аннотациям java, я надеюсь, что вы чему-то научились из него.
Обновления аннотаций Java :
- Спецификации сервлетов 3.0 ввели использование аннотаций для конфигурации сервлетов и параметров инициализации, подробнее читайте в Учебник по сервлетам Java .
- Мы можем использовать аннотации в Struts 2 для настройки его классов действий и страниц результатов, проверьте рабочий пример в Struts2 Пример аннотации Hello World .
Ссылка: Веб-сайт Oracle