Основы аннотирования


Аннотации создаются посредством механизма, основанного на интерфейсе. Начнем с примера. Вот объявление аннотации под названием МуАппо:

//Простой тип аннотации. @interface MyAnno {
String str();
int val();
}

Во-первых, обратите внимание на символ @, предшествующий ключевому слову interface. Это говорит компилятору, что объявлен тип аннотации. Далее отметим два метода-члена — str () и val (). Все аннотации состоят только из объявлений методов. Однако вы не определяете тел этих методов. Вместо этого их реализует Java. Более того, методы ведут себя в большей степени подобно полям, как вы вскоре убедитесь.

Аннотация не может включать слова extends. Однако все аннотации автоматически расширяют интерфейс Annotation. То есть Annotation является суперинтерфейсом для всех аннотаций. Он объявлен в пакете java.lang.annotation. В Annotation переопределены методы hashCode (), equals () и toStr ing (), которые определены в Ob j ect. В нем также специфицирован метод annotationType () .возвращающий объект Class, который представляет вызывающую аннотацию.

Объявив аннотацию, вы можете использовать ее для аннотирования объявления. Любой тип объявления может иметь аннотацию, ассоциированную с ним. Например, аннотироваться могут классы, методы, поля, параметры и константы enum. Аннотированной может быть даже сама аннотация. Во всех случаях аннотация предшествует остальной части объявления.

Когда вы применяете аннотацию, то присваиваете значения ее членам. Например, ниже показан вариант применения MyAnno к методу: // Аннотирование метода.
@MyAnno(str = "Пример аннотации", val = 100)
public static voidmyMeth() {
// ...
}

Эта аннотация связана с методом myMeth (). Посмотрите внимательно на синтаксис аннотации. За именем аннотации, которому предшествует @, следует взятый в скобки список инициализаторов членов. Чтобы присвоить члену значение, значение присваивается имени члена. Таким образом, в этом примере строка "Пример аннотации" присваивается члену str MyAnno. Обратите внимание, что в этом присваивании никаких скобок за str не следует. Когда члену аннотации дается значение, используется только его имя. То есть члены аннотации в данном контексте выглядят как поля.