Поиск по сайту:

Java-аннотации


Аннотации Java предоставляют информацию о коде. Аннотации Java не оказывают прямого влияния на код, который они аннотируют. В учебнике по аннотациям Java мы рассмотрим следующее;

  1. Встроенные аннотации Java
  2. Как написать пользовательскую аннотацию
  3. Использование аннотаций и анализ аннотаций с помощью Reflection API.

Java-аннотации

Пользовательская аннотация 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:

  1. Методы аннотации не могут иметь параметров.
  2. Типы возвращаемых данных методов аннотации ограничены примитивами, строками, перечислениями, аннотациями или их массивами.
  3. Методы аннотации Java могут иметь значения по умолчанию.
  4. К аннотациям могут быть прикреплены метааннотации. Мета-аннотации используются для предоставления информации об аннотации.

Мета-аннотации в java

Существует пять типов мета-аннотаций:

  1. @Documented — указывает, что элементы, использующие эту аннотацию, должны документироваться с помощью javadoc и подобных инструментов. Этот тип следует использовать для аннотирования объявлений типов, чьи аннотации влияют на использование аннотированных элементов их клиентами. Если объявление типа снабжено аннотацией Documented, его аннотации становятся частью общедоступного API аннотированных элементов.
  2. @Target — указывает виды элементов программы, к которым применим тип аннотации. Возможные значения: ТИП, МЕТОД, КОНСТРУКТОР, ПОЛЕ и т. д. Если целевая метааннотация отсутствует, аннотацию можно использовать для любого элемента программы.
  3. @Inherited — указывает, что тип аннотации наследуется автоматически. Если пользователь запрашивает тип аннотации в объявлении класса, а в объявлении класса нет аннотации для этого типа, то суперкласс класса будет автоматически запрошен для типа аннотации. Этот процесс будет повторяться до тех пор, пока не будет найдена аннотация для этого типа или не будет достигнута вершина иерархии классов (объект).
  4. @Retention — указывает, как долго должны храниться аннотации с аннотированным типом. Он принимает аргумент RetentionPolicy, возможные значения которого: SOURCE, CLASS и RUNTIME.
  5. @Repeatable – используется для указания того, что тип аннотации, объявление которого он аннотирует, является повторяемым.

Встроенные аннотации в Java

Java Предоставляет пять встроенных аннотаций.

  1. @Override — когда мы хотим переопределить метод суперкласса, мы должны использовать эту аннотацию, чтобы сообщить компилятору, что мы переопределяем метод. Поэтому, когда метод суперкласса удален или изменен, компилятор покажет сообщение об ошибке. Узнайте, почему мы всегда должны использовать аннотацию переопределения Java при переопределении метода.
  2. @Deprecated — когда мы хотим, чтобы компилятор знал, что метод устарел, мы должны использовать эту аннотацию. Java рекомендует, чтобы в javadoc мы предоставили информацию о том, почему этот метод устарел и какую альтернативу можно использовать.
  3. @SuppressWarnings — это просто указывает компилятору игнорировать определенные предупреждения, которые они выдают, например, используя необработанные типы в дженериках Java. Его политика хранения — ИСТОЧНИК, и компилятор отбрасывает его.
  4. @FunctionalInterface – эта аннотация появилась в функциональном интерфейсе.
  5. @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

Мы будем использовать Reflection для анализа аннотаций 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-интерфейс Reflection очень мощный и широко используется в средах Java, J2EE, таких как Spring, Reflection in Java. Это все, что касается учебника по примерам аннотаций Java, я надеюсь, что вы чему-то научились из него. Обновления аннотаций Java:

  1. В Спецификациях сервлетов 3.0 введено использование аннотаций для конфигурации сервлетов и параметров инициализации, подробнее см. в Учебном руководстве по сервлетам Java.
  2. Мы можем использовать аннотации в Struts 2 для настройки его классов действий и страниц результатов, проверьте рабочий пример в примере аннотации Struts 2 Hello World.

Ссылка: сайт Oracle