English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы изучим на примерах, что такое аннотации, различные Java-аннотации и как их использовать.
Аннотации Java являются метаданными нашего программного кода (данные о данных).
Они предоставляют компилятору дополнительную информацию о программе, но не являются частью программы. Эти анализаторы не влияют на выполнение скомпилированной программы.
Аннотации начинаются с @. Грамматика:
@AnnotationName
Давайте рассмотрим пример с анализатором @Override.
@Override анализирует метод, помеченный этим анализатором, на переписывание с использованием метода с таким же именем, типом возвращаемого значения и списком параметров родительского класса.
При переписывании методов не обязательно использовать @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. При вызове этого метода вызывается метод подкласса, а не метод родительского класса.
Комментарии также могут включать элементы (члены/атрибуты/параметры).
Маркерные комментарии не содержат членов/элементов. Они используются только для маркировки заявлений.
Его грамматика такова:
@AnnotationName()
Эти комментарии не содержат элементов, поэтому не требуют скобок. Например:
@Override
Одноэлементные комментарии содержат только один элемент.
Его грамматика такова:
@AnnotationName(elementName = "elementValue")
Если есть только один элемент, то по习惯у его называют value.
@AnnotationName(value = "elementValue")
В этом случае также можно удалить имя элемента. По умолчанию имя элемента value.
@AnnotationName("elementValue")
Эти комментарии содержат несколько элементов, разделенных запятыми.
Его грамматика такова:
@AnnotationName(element1 = "value1", element2 = "value2")
Любое объявление можно отметить комментарием, поместив его над声明ом. С Java 8 комментарии также могут быть放在 перед типом.
Как указано выше, комментарии Java могут быть放在上方 класса, метода, интерфейса, поля и других элементов объявления программы.
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<>();
До 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. Предопределенные аннотации
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
2. Мета-аннотации
@Retention
@Documented
@Target
@Inherited
@Repeatable
3. Пользовательские аннотации
Эти типы аннотаций вJava типы аннотацийПодробнее описано в руководстве.
Инструкции компилятора - Используются для предоставления инструкций компилятору, обнаружения ошибок или禁止 предупреждений. Например,内置анные аннотации @Deprecated, @Override, @SuppressWarnings.
Инструкции во время компиляции - Эти комментарии предоставляют инструкции для компилятора, помогающие генерировать код, XML файлы и т.д. во время компиляции.
Инструкции во время выполнения - Можно определить некоторые аннотации для предоставления инструкций программе во время выполнения. Эти аннотации доступны с помощью Java reflection.