Аннотации (Annotations) — это специальная форма метаданных, которая может быть добавлена в исходный код Java. Они предоставляют дополнительную информацию о программе, которая может быть использована компилятором, runtime-окружением или другими инструментами. Аннотации не изменяют поведение кода напрямую, но могут влиять на его выполнение или обработку.
Java предоставляет несколько встроенных аннотаций, таких как:
@Override
: Указывает, что метод переопределяет метод суперкласса.@Deprecated
: Показывает, что элемент устарел и не рекомендуется к использованию.@SuppressWarnings
: Подавляет предупреждения компилятора.@Override
public String toString() {
return "This is an overridden method";
}
Мета-аннотации — это аннотации, которые применяются к другим аннотациям. Они определяют, как аннотация может быть использована. Основные мета-аннотации:
@Retention
: Определяет, на каком уровне доступна аннотация (источник, класс, runtime).@Target
: Указывает, к каким элементам может быть применена аннотация (класс, метод, поле и т.д.).@Documented
: Указывает, что аннотация должна быть включена в JavaDoc.@Inherited
: Показывает, что аннотация наследуется подклассами.Для создания своей аннотации используется ключевое слово @interface
. Аннотация может содержать элементы, которые похожи на методы, но не имеют параметров и могут возвращать только примитивные типы, строки, классы, перечисления или массивы.
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME) // Аннотация доступна в runtime
@Target(ElementType.METHOD) // Аннотация может быть применена к методам
public @interface MyAnnotation {
String value() default "default value"; // Элемент аннотации с значением по умолчанию
int count() default 1; // Другой элемент аннотации
}
После создания аннотации её можно использовать в коде, указывая значения для её элементов.
public class MyClass {
@MyAnnotation(value = "custom value", count = 5)
public void myMethod() {
System.out.println("Method with custom annotation");
}
}
Для обработки аннотаций в runtime можно использовать Reflection API. Это позволяет анализировать аннотации и выполнять определённые действия в зависимости от их значений.
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void main(String[] args) throws Exception {
MyClass obj = new MyClass();
Method method = obj.getClass().getMethod("myMethod");
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println("Value: " + annotation.value());
System.out.println("Count: " + annotation.count());
}
}
}
Если запустить код выше, то вывод будет следующим:
Value: custom value
Count: 5
@Override
, @Deprecated
и @SuppressWarnings
, используются для стандартных задач.@Retention
, @Target
, @Documented
и @Inherited
, определяют поведение аннотаций.@interface
, указание элементов и использование Reflection API для обработки.