Annotation (Аннотация) используется для предоставления метаданных для вашего Java кода. Как метаданные, Annotation не влияют напрямую на выполнение ваших кодов, несмотря на то, что некоторые аннотации могут быть реально использованы с той целью. Annotation добавлен в Java, начиная с Java 5
Annotation используются с целью
Инструкция для компилятора (Compiler)
Инструкция во время построения (Build-time)
Инструкция во время запуска (Runtime)
1.1- Инструкция для компилятора
Java имеет 3 Annotation, которые вы можете использовать для предоставления инструкций для компилятора Java.
@Deprecated
@Override
@SuppressWarnings
Эти Annotation объяснены более детально в данной статье.
1.2- Интструкция по времени построения (Build-time)
Annotation может быть использован во время построения (Build-time), когда вы строите ваш проект программного обеспечения. Процесс построения включает создание исходных кодов, компиляции исходных кодов создание файлов XML (например дескрипторы развертывания), упаковка скомпилированного кода и файлов в один файл JAR, и т.д. Построение программного обеспечения обычно выполняется автоматическим инструментом строения как Apache Ant или Apache Maven . Строение инструментов, которые могут сканировать ваш код Java и в зависимости от ваших аннотаций (Annotation) создать исходный код или другие файлы на основании этих аннотаций.
1.3- Инструкция по времени запуска (Runtime)
Обчычно, Annotation не присутствуют в вашем коде Java после компиляции. Но можно определить ваши Annotation во время запуска. Эти аннотации потом могут быть доступны через Java Reflection, и использоваться для инструкции ваших программ, или API третьей стороны (Third party API).
Имеются 3 важных Annotation в Java
@Deprecated
@Override
@SuppressWarnings
2.1- @Deprecated
Это Annotation использующийся для аннотации чего-то устаревшего, как класс или метод, который не стоит больше использовать.
Аннотация @Deprecated компилятор интересуется, чтобы оповестить вас об альтернативе. Или с программированием IDE, например Eclipse так же показывает вам визуальные оповещения.
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
В следующей иллюстрации Eclipse оповещает вас:
java - джава - учиться java - учебник java -
нерекомендуемый метод демо java
- примеры java - java-программы
2.2- @Override
Annotation @Override используется для методов, которые переопределяют метод в суперклассе (superclass). Если данный метод не соответствует методу в суперклассе, компилятор оповестит вас об ошибке.
Annotation @Override не обязателен чтобы переопределить метод суперкласса. Все же это хорошая идея для использования. В случае, если кто-то изменил название метода супекласса, метод в вашем классе больше не будет переопределенным методом. При отсутствии аннотации @Override вы не найдете. С аннотациями @Override компилятор оповестит вас о том, что методы подкласса не переопределяют методы в суперклассе.
Смотрите пример:
Job.java
package org.wikitechy.tutorial.ann.builtin;
publicclass Job {
// Это метод класса Job.publicString getName() {
returnnull;
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
JavaCoding.java
package org.wikitechy.tutorial.ann.builtin;
public classJavaCodingextendsJob{
// Это метод, который переопределяет метод getName() родительского класса.// @Override не обязан быть прикрепленным к этому методу.// Но необходим если кто-то менят название метода getName()// родительского класса, для вас будет оповещение об ошибке.
@Override
public String getName() {
return"Java Coding";
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
И это оповещение Java Compiler:
java - джава - учиться java - учебник java -
Имя задания метода
- примеры java - java-программы
2.3- @SuppressWarnings
Аннотация @SuppressWarnings заставляет компилятор останавливать предупреждения определенного метода. Например, метод вызывает устаревший метод, или внутри метода есть небезопасный вид, компилятор может создать предупреждение. Вы можете отключить эти предупреждения аннотацией данного метода используя @SuppressWarnings.
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Смотрите предупреждения компилятора:
java - джава - учиться java - учебник java -
подавить предупреждение демо
- примеры java - java-программы
SuppressWarningsDemo2.java
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public classSuppressWarningsDemo2{
public List<?> getDatas() {
List<String> list = new ArrayList<String>();
list.add("One");
return list;
}
@SuppressWarnings({ "deprecation", "unused", "unchecked" })
public void processDatas() {
// Вы используете устаревший конструктор// И переменная 'date' создана, но не используется.Date date = newDate(2014, 9, 25);
// Сделать небезопасный cast.// Переменная 'datas' создана, но не используется в коде.
List<String> datas = (List<String>) this.getDatas();
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Предупреждения компилятора:
java - джава - учиться java - учебник java -
подавить предупреждение демо2
- примеры java - java-программы
3- Напишите ваш Annotation
Используя @interface как ключевое слово объявления Annotation, annotation довольно похож на интерфейс. Annotation содержит или не содержить элементы (elements) внутри.
Характеристики элементов (element) annotation:
Нет функциональной основы
Нет функционального параметра
Возвращенное объявление должно быть определенного вида:
Примитивный вид (boolean, int, float, ...)
Enum
Annotation
Class (Например: String.class)
Может иметь значение по умолчанию
3.1- Ваш первый Annotation
MyFirstAnnotation.java
package org.wikitechy.tutorial.ann1;
public@interface MyFirstAnnotation {
// Элемент 'name'.
public String name();
// Элемент 'description', со значением по умолчанию "".publicString description() default"";
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Annotation может использоваться на:
TYPE - Прикрепленный на объявлении Class, interface, enum, annotation.
FIELD - Прикрепленный на объявлении поля (field), включая констанции enum.
METHOD - Прикрепленный на объявлении method.
PARAMETER - Прикрепленный на объявлении parameter
CONSTRUCTOR - Прикрепленный на объявлении конструктора
LOCAL_VARIABLE - Прикрепленный на локальной переменной.
ANNOTATION_TYPE - Прикрепленный на объявлении Annotation
PACKAGE - Прикрепленный на объявлении package.
UsingMyFirstAnnotation.java
@MyFirstAnnotation(name = "Some name", description = "Some description")
publicclass UsingMyFirstAnnotation {
// Annotation (Аннотация) прикреплена к Constructor (Конструктору).// Со значением элемента name "John"// Значение элемента description является "Write by John".@MyFirstAnnotation(name = "John", description = "Write by John")
public UsingMyFirstAnnotation() {
}
// Annotation được gắn trên một phương thức.// Со значением элемента 'name' "Tom"// Элемент 'description' не объявлен, он будет взят по умолчанию.@MyFirstAnnotation(name = "Tom")
publicvoid someMethod() {
}
// Annotation прикреплена к параметру одного метода.publicvoid todo(@MyFirstAnnotation(name = "none") String job) {
// Annotation прикреплена к локальной переменной.@MyFirstAnnotation(name = "Some name")
int localVariable = 0;
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
3.2- Annotation с элементом value. (Особенный)
Annotation имеет элемент с названием value, который имеет особенные характеристики:
AnnWithValue.java
package org.wikitechy.tutorial.ann2;
public @interface AnnWithValue {// Элемент с названием 'value', Аннотации.// Имеет некоторую особенность при использовании данного элемента.
public int value();
// Элемент 'name'
public String name() default "";
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
UsingAnnWithValue.java
package org.wikitechy.tutorial.ann2;
publicclass UsingAnnWithValue {
// Генерировать элементы Аннотации обычным способом.@AnnWithValue(name = "Name1", value = 100)
publicvoid someMethod1() {
}
// Генерировать элементы Аннотации обычным способом.// Элемент 'name' Аннотации будет иметь значение по умолчанию@AnnWithValue(value = 100)
publicvoid someMethod2() {
}
// Элемент с названием 'value' является особенным.// Вместо @AnnWithValue(value = 100)// Вам нужно написать только @AnnWithValue(100)@AnnWithValue(100)
publicvoid someMethod3() {
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
3.3- @Retention & @Target
RetentionPolicy.SOURCE: Существует на исходном коде, и не узнаваем компилятором (compiler).
RetentionPolicy.CLASS: Компилятер разпознает существование, но не распознается виртуальной машиной при запуске (Runtime).
RetentionPolicyRUNTIME: достигает высшую степень существования, разпознается компилятором (compiler), и распознается существование виртуальной машиной при запуске.
@Target
@Target: Используется для примечания другого annotation, и в каких сферах тот annotation будет использоваться.
ElementType.TYPE - Прикреплен на объявлении Class, interface, enum, annotation.
ElementType.FIELD - Прикреплен на объявлении поля (field), включая константы enum.
ElementType.METHOD - Прикреплен на объявлении method.
ElementType.PARAMETER - Прикреплен на объявлении parameter
ElementType.CONSTRUCTOR - Прикреплен на объявлении конструктора
ElementType.LOCAL_VARIABLE - Прикреплен на объявлении локальной переменной.
ElementType.ANNOTATION_TYPE - Прикреплен на объявлении Annotation
ElementType.PACKAGE - Прикреплен на объявлении package.
AnnFM.java
package org.wikitechy.tutorial.ann3;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// Данная аннотация (Annotation) говорит, что AnnFM только распознается на исходном коде.// Он не будет распознан компилятором (compiler),// и во время запуска виртуальной машины, так же не будет знать о его существовании.
@Retention(value = RetentionPolicy.SOURCE)
// Данная аннотация (Annotation) говорит:// AnnFM будет использован только как аннотация (annotate) на FIELD или METHOD.
@Target(value = { ElementType.FIELD, ElementType.METHOD })
public @interface AnnFM {
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
UsingAnnFM.java
package org.wikitechy.tutorial.ann3;
public classUsingAnnFM{
// AnnFM может только аннотировать (annotate) на FIELD или METHOD.
@AnnFM
protected int someField = 100;
// AnnFM может только аннотировать (annotate) на FIELD или METHOD.
@AnnFM
public void someMethod() {
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
3.4- Annotation & Reflection
Java Reflection может определить такие вещи как (Class, field, method, ..) аннотированный используя некоторый Annotation. И конечно же, он распознает Annotation имеющие @Retention(RetentionPolicy.RUNTIME)
Пример ниже описывет программу, которая читает аннотации в файлах Java и создает файлы Html. Каждый class соответствует файлу html.
java - джава - учиться java - учебник java -
Java пакет html
- примеры java - java-программы
java - джава - учиться java - учебник java -
Аннотация пакет
- примеры java - java-программы
AnnHtmlUL.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
// Данная аннотация (Annotation) говорит:// AnnHtmlUL используется только для Class, interface, annotation, enum.
@Target(value = { ElementType.TYPE })
// AnnHtmlUL: Симулирует тег (tag) <UL> в HTML.
public @interface AnnHtmlUL {
public String border() default"border:1px solid blue;";
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
AnnHtmlLI.java
package org.wikitechy.tutorial.ann4;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.FIELD, ElementType.METHOD })
// Симулирует тег (tag) <LI> в HTML.
public @interface AnnHtmlLI {
public String background();
public String color() default"red";
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Вы создаете ваш Annotation и используете их в вашем приложении Java. Эти Annotation имеют правило использования данное вами. Вы хотите, чтобы компилятор Java оповещал ошибку при неправильном использовании во время компиляции. И если вы используете Eclipse чтобы написать код, Eclipse оповещает об ошибке прямо на IDE.
Это вполне возможно с APT ( Annotation Processing Tool).
Вы можете посмотреть инструкцию APT по ссылке:
Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
1- Введение
Статья основана на:
Eclipse 4.6 (NEON)
Java 7
2- Что такое Annotation Processing Tool (APT)
Приводится ситуация:
Вы создаете некоторые свои Annotation и используете их в вашем приложении Java. Эти Annotation имеют правила использования данные вами. Вы хотитте, чтобы компилятор Java (Java compiler) оповещал ошибку использования не по правилам если они возникают во время компиляции. И если вы используете Eclipse чтобы написать код, вы хотите чтобы Eclipse оповещал ошибки использования прямо на IDE.
Это вполне выполнимо с APT ( Annotation Processing Tool).
Определение APT:
APT (Java annotation processing tool) это инструмент, который вы можете использовать для обработки annotation на исходном коде Java. Все что вам нужно это выполнить (implements) процессор Annotation.
Например:
@PublicFinal это ваш annotation, ваше правило - он может аннотировать только на методе или поле с модификатром, являющимся публичным и финальным. Если использовать неправильно, оповещение отобразится во время компиляции, одновременно выдает оповещение на IDE:
3- Модель примера
Это модель примера, который я представлю в этой статье:
java - джава - учиться java - учебник java -
apt процессор
- примеры java - java-программы
Ваши Annotation:
@PublicFinal используется только для метода или поля с модификатором (modifier), являющимися публичными и финальными (public và final).
@Controller использутеся только для клсса, и название класса должно иметь суффикс Controller.
@Action используется тоько для метода, возвращающего вид String.
Процессоры PublicFinalProcessor, ControllerProcessor, ActionProcesser будут выполнять задание оповещения при неправильном использовании во время компиляции, включая отображение оповещения ошибок на IDE Eclipse.
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Declare Service
java - джава - учиться java - учебник java -
метаданных apt процессора
- примеры java - java-программы
Упаковка project APTProcessor в file jar:
Нажмите на правую кнопку мыши на Project и выберите Export:
java - джава - учиться java - учебник java -
экспорт java
- примеры java - java-программы
java - джава - учиться java - учебник java -
jarfile экспорт java
- примеры java - java-программы
java - джава - учиться java - учебник java -
jar файла specificati
- примеры java - java-программы
java - джава - учиться java - учебник java -
вариант упаковки jar
- примеры java - java-программы
java - джава - учиться java - учебник java -
банку манифеста спецификация
- примеры java - java-программы
Export успешно:
java - джава - учиться java - учебник java -
aptp процессор
- примеры java - java-программы
5- Project APTTutorial
Создать Project APTTutorial:
java - джава - учиться java - учебник java -
aptp учебник
- примеры java - java-программы
Нажать на правую кнопку мыши на APTTutorial и выбрать properties.Объявить использование библиотеки APTProccessor который вы создали до этого.
java - джава - учиться java - учебник java -
свойства aptp учебник
- примеры java - java-программы
Объявить использование вашего Annotation Processor c Compiler.
java - джава - учиться java - учебник java -
Аннотация propertites
- примеры java - java-программы
java - джава - учиться java - учебник java -
Продаю aptt учебник
- примеры java - java-программы
Объявить местоположение библиотеки Processor:
java - джава - учиться java - учебник java -
путь заводе
- примеры java - java-программы
Вы можете нажать на Advanced.. чтобы увидеть какой Processor уже зарегистрирован с Compiler
java - джава - учиться java - учебник java -
путь заводе расширенный
- примеры java - java-программы
Нажмите на OK чтобы завершить:
java - джава - учиться java - учебник java -
свойств фабрика путь расширенный
- примеры java - java-программы
java - джава - учиться java - учебник java -
Параметры обработки аннотаций
- примеры java - java-программы
Создать некоторые классы test используя ваши Annotation и Processor:
java - джава - учиться java - учебник java -
АПТВ учебного пакета обозревателя
- примеры java - java-программы
PublicFinalTest.java
package org.wikitechy.tutorial.apttest;
import com.wikitechy.ann.PublicFinal;
public classPublicFinalTest{
@PublicFinal
public final static int ABC = 100;
@PublicFinal
private static String MODULE_NAME = "APT";
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
Оповещение ошибки отображенное на IDE:
java - джава - учиться java - учебник java -
Заключительный тест java
- примеры java - java-программы
TestActionController_01.java
packageorg.wikitechy.tutorial.apttest;
importcom.wikitechy.ann.Action;
importcom.wikitechy.ann.Controller;
@Controller
public class TestActionController_01 {
@Action
public String exit() {
returnnull;
}
@Action
public void print() {
}
@Action
public int error() {
return 0;
}
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда
учебник java annotationsПример аннотации javaсписок аннотаций javaаннотации в java учебном пунктеаннотация в java-точке javaчто примечание веснойчто такое метаданные в javaаннотации в селенеучебник java annotationsаннотации в java учебном пунктеаннотация в java-точке javaтипы аннотаций в javaкласс аннотации java