Главная страница

АБОБА. Справочник по программированию на Java Методическое пособие


Скачать 242.41 Kb.
НазваниеСправочник по программированию на Java Методическое пособие
АнкорАБОБА
Дата20.02.2022
Размер242.41 Kb.
Формат файлаdocx
Имя файла12642_java_method_1.docx
ТипСправочник
#368066
страница55 из 67
1   ...   51   52   53   54   55   56   57   58   ...   67

Получение всех аннотаций


Вы можете получить сразу все аннотации, имеющие @Retention, равную RUNTIME, которые ассоциированы с позицией, вызвав getAnnotations() для этой позиции. Общая форма этого метода выглядит так:

Annotation[] getAnnotations()

Он возвращает массив аннотаций. getAnnotations() может быть вызван для объектов типа Class, Method, Constructor и Field.

Вот еще один пример с рефлексией, который показывает, как получить все аннотации, ассоциированные с классом и методом. Он объявляет две аннотации. Затем он использует их для аннотирования класса и метода.

// Показать все аннотации для класса и метода.

import java.lang.annotation.*;

import java.lang.reflect.*;

@Retention(RetentionPolicy.RUNTIME)

@interface MyAnno {

String str();

int val();

}

@Retention(RetentionPolicy.RUNTIME)

@interface What {

String description();

}

@What(description = "Аннотация тестового класса")

@MyAnno(str = "Meta2", val = 99)

class Meta2 {

@What(description = "Аннотация тестового метода")

@MyAnno(str = "Testing", val = 100)

public static void myMeth() {

Meta2 ob = new Meta2();

try {

Annotation annos[] = ob.getClass().getAnnotations();

// Отобразить все аннотации для Meta2.

System.out.println("Все аннотации для Meta2:");

BookNew_JAVA-7.indb 303 02.06.2007 1:07:06

304 Часть I. Язык Java

for(Annotation a : annos)

System.out.println(a);

System.out.println();

// Отобразить все аннотации для myMeth.

Method m = ob.getClass( ).getMethod("myMeth");

annos = m.getAnnotations();

System.out.println("Все аннотации для myMeth:");

for(Annotation a : annos)

System.out.println(a);

} catch (NoSuchMethodException exc) {

System.out.println("Метод не найден.");

}

}

public static void main(String args[]) {

myMeth();

}}

Ниже показан результат работы этой программы:

Все аннотации для Meta2:

@What(description=Аннотация тестового класса)

@MyAnno(str=Meta2, val=99)

Все аннотации для myMeth:

@What(description=Аннотация тестового метода)

@MyAnno(str=Testing, val=100)

Эта программа использует getAnnotations() для получения массива всех аннотаций, ассоциированных с классом Meta2 и методом myMeth(). Как объяснялось, getAnnotations() возвращает массив объектов Annotation. Вспомните, что Annotation – это суперинтерфейс для всех интерфейсов аннотаций, и что он переопределяет toString() из класса Object. То есть когда выводится ссылка на Annotation, вызывается его метод toString() для генерации строки, описывающей аннотацию, что и демонстрирует предыдущий пример.

Встроенные аннотации


В Java определено очень много встроенных аннотаций. Большинство из них специализированы, но семь имеют общее назначение. Четыре из них импортируются из java.lang.annotation: @Retention, @Documented, @Target и @Inherited. Три других – @Override, @Deprecated и @SuppressWarnings – включены в java.lang.

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

@Documented – это маркер-интерфейс, который сообщает инструменту, что аннотация должна быть документирована. Он предназначен для использования только в качестве аннотации к объявлению аннотации.

@Target – аннотация, специфицирующая типы объявлений, к которым может быть применима аннотация. Предназначена для использования только в качестве аннотации к другим аннотациям. @Target принимает один аргумент, который должен быть константой из перечисления ElementType. Этот аргумент специфицирует типы объявлений, к которым может быть применена аннотация.

@Inherited – аннотация-маркер, которая может применяться в другом объявлении аннотации. Более того, она касается только тех аннотаций, что будут использоваться в объявлениях классов. @Inherited позволяет аннотации суперкласса быть унаследованной в подклассе. Таким образом, когда осуществляется запрос к подклассу на предмет специфической аннотации, то если у этой аннотации в подклассе нет, проверяется суперкласс. Если запрошенная аннотация присутствует у суперкласса и она аннотирована как @Inherited, то эта аннотация будет возвращена.

@Override – аннотация-маркер, которая может применяться только в методах. Метод, аннотированный как @Override, должен переопределять метод суперкласса. Если он этого не делает, в результате возникает ошибка времени компиляции. Она используется для обеспечения того, что метод суперкласса будет действительно переопределен, а не просто перегружен.

@Deprecated – аннотация-маркер. Она указывает, что объявление устарело и должно быть заменено более новой формой.

@SuppressWarnings – указывает, что одно или более предупреждений, которые могут быть выданы компилятором, следует подавить. Подавляемые предупреждения специфицируются именами в строковой форме. Эта аннотация может быть применима к объявлениям любого типа.

Существует некоторое количество ограничений, касающихся объявления аннотаций. Во-первых, одна аннотация не может наследовать другую. Во-вторых, все методы, объявленные в аннотации, должны не принимать параметров. Более того, они должны возвращать один из перечисленных ниже типов: примитивный тип, такой как int или double; объект типа String или Class; тип enum; тип другой аннотации; массив одного из предыдущих типов.

Аннотации не могут быть обобщенными. Другими словами, они не могут принимать параметры-типы. И, наконец, в методах аннотации не может быть указана конструкция throws.
1   ...   51   52   53   54   55   56   57   58   ...   67


написать администратору сайта