English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Java

Java Управление потоком

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Списки (List)

Java Queue (очередь)

Java Map-сборники

Java Set-сборники

Java Ввод/вывод (I/O)

Java Reader/Writer

Другие темы Java

Аннотации (Annotations) Java

В этом руководстве мы изучим на примерах, что такое аннотации, различные Java-аннотации и как их использовать.

Аннотации Java являются метаданными нашего программного кода (данные о данных).

Они предоставляют компилятору дополнительную информацию о программе, но не являются частью программы. Эти анализаторы не влияют на выполнение скомпилированной программы.

Аннотации начинаются с @. Грамматика:

@AnnotationName

Давайте рассмотрим пример с анализатором @Override.

@Override анализирует метод, помеченный этим анализатором, на переписывание с использованием метода с таким же именем, типом возвращаемого значения и списком параметров родительского класса.

При переписывании методов не обязательно использовать @Override. Однако, если мы его используем, компилятор выдаст ошибку при возникновении ошибки в процессе переписывания метода (например, неправильный тип параметра).

Пример 1: Пример комментария @Override

class Animal {
  public void displayInfo() {
    System.out.println("I am an animal.");
  }
}
class Dog extends Animal {
  @Override
  public void displayInfo() {
    System.out.println("I am a dog.");
  }
}
class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    d1.displayInfo();
  }
}

результат вывода

I am a dog.

В этом примере метод displayInfo() существует как в родительском классе Animal, так и в подклассе Dog. При вызове этого метода вызывается метод подкласса, а не метод родительского класса.

Формат комментария

Комментарии также могут включать элементы (члены/атрибуты/параметры).

1. Маркерные комментарии

Маркерные комментарии не содержат членов/элементов. Они используются только для маркировки заявлений.

Его грамматика такова:

@AnnotationName()

Эти комментарии не содержат элементов, поэтому не требуют скобок. Например:

@Override

2. Одноэлементные комментарии

Одноэлементные комментарии содержат только один элемент.

Его грамматика такова:

@AnnotationName(elementName = "elementValue")

Если есть только один элемент, то по习惯у его называют value.

@AnnotationName(value = "elementValue")

В этом случае также можно удалить имя элемента. По умолчанию имя элемента value.

@AnnotationName("elementValue")

3. Многоэлементные комментарии

Эти комментарии содержат несколько элементов, разделенных запятыми.

Его грамматика такова:

@AnnotationName(element1 = "value1", element2 = "value2")

Местоположение комментария

Любое объявление можно отметить комментарием, поместив его над声明ом. С Java 8 комментарии также могут быть放在 перед типом.

1. Над声明

Как указано выше, комментарии Java могут быть放在上方 класса, метода, интерфейса, поля и других элементов объявления программы.

Пример 2: Пример комментария @SuppressWarnings

import java.util.*;
class Main {
  @SuppressWarnings("unchecked")
  static void wordsList() {
    ArrayList wordList = new ArrayList<>();
    // это вызовет предупреждение о не проверенном
    wordList.add("w3codebox"); 
    System.out.println("Word list => " + wordList);
  }
  public static void main(String args[]) {
    wordsList();
  }
}

результат вывода

Word list => [w3codebox]

Если указанный выше программный код компилируется без использования аннотации @SuppressWarnings("unchecked"), то компилятор все равно скомпилирует этот программный код, но выдаст следующее предупреждение:

Main.java использует не проверенные или небезопасные операции.
Word list => [w3codebox]

мы получили предупреждение

Main.java использует не проверенные или небезопасные операции

поэтому следующий пассаж.

ArrayList wordList = new ArrayList<>();

Это потому, что мы еще не определили общий тип массивного списка. Мы можем решить этот предупреждение, указав generics в фигурных скобках <>.

ArrayList<String> wordList = new ArrayList<>();

2. типовые аннотации

До Java 8 комментарии могли применяться только к объявлениям. Теперь их также можно использовать для типов. Это означает, что мы можем размещать аннотации в любом месте использования типа.

вызов конструктора

new @Readonly ArrayList<>()

тип определения

@NonNull String str;

Это заявление определяет не-null переменную str типа String, чтобы избежать NullPointerException.

@NonNull List<String> newList;

Это заявление определяет не-null список типа String.

List<@NonNull String> newList;

Это заявление определяет список не-null значений типа String.

тип преобразования
newStr = (@NonNull String) str;

подзадачи extends и implements

class Warning extends @Localized Message

throws подзадача

public String readMethod() throws @Localized IOException

Типовые аннотации позволяют Java коду получить лучшее анализ и предоставить более мощные типовые проверки.

Типы аннотаций

1. Предопределенные аннотации

  1. @Deprecated

  2. @Override

  3. @SuppressWarnings

  4. @SafeVarargs

  5. @FunctionalInterface

2. Мета-аннотации

  1. @Retention

  2. @Documented

  3. @Target

  4. @Inherited

  5. @Repeatable

3. Пользовательские аннотации

Эти типы аннотаций вJava типы аннотацийПодробнее описано в руководстве.

Использование аннотаций

  • Инструкции компилятора - Используются для предоставления инструкций компилятору, обнаружения ошибок или禁止 предупреждений. Например,内置анные аннотации @Deprecated, @Override, @SuppressWarnings.

  • Инструкции во время компиляции - Эти комментарии предоставляют инструкции для компилятора, помогающие генерировать код, XML файлы и т.д. во время компиляции.

  • Инструкции во время выполнения - Можно определить некоторые аннотации для предоставления инструкций программе во время выполнения. Эти аннотации доступны с помощью Java reflection.