Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Герберт Шилдт. Java 2, v5.0 (Tiger). Новые возм...doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
1.21 Mб
Скачать

Листинг 7.3. Получение всех аннотаций для класса и метода

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 = "An annotation test class")

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

class Meta2 {

@What(description = "An annotation test method")

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

public static void myMeth() {

Meta2 ob = new Meta2();

try {

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

// Display all annotations for Meta2.

System.out.println("All annotations for Meta2:");

for(Annotation a : annos)

System.out.println(a);

System.out.println();

// Display all annotations for myMeth.

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

annos = m.getAnnotations();

System.out.println("All annotations for myMeth:");

for(Annotation a : annos)

System.out.println(a);

}

catch (NoSuchMethodException exc) {

System.out.println("Method Not Found.");

}

} public static void main(String args[]) {

myMeth();

}

}

Далее приведен вывод результатов работы программы из листинга 7.3:

All annotations for Meta2:

@What (description=An annotation test class)

SMyAnno (str=Meta2, val=99)

All annotations for myMeth:

@What {description=An annotation test method)

@MyAnno (str=Testing, val=100}

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

Интерфейс AnnotatedElement

Методы getAnnotation() и getAnnotations(), применявшиеся в предыдущих примерах, определены в новом интерфейсе AnnotatedElement, который включен в пакет Java.lang.reflect. Этот интерфейс поддерживает рефлексию для аннотаций и реализован в классах Method, Field, Сonstructor, Сlass и Package. В нем определены методы, перечисленные в табл. 7.1. Следовательно, эти методы доступны для любого объекта, который сопровождается аннотацией.

Та6лица7.1. Методы, определенные в интерфейсе AnnotatedElement

Методы

Описание

<Т extends Annotation> T getAnno-tatioiUClass<T> annoType)

Возвращает аннотацию типа аnnоТуре, связанную с вызывающим объектом

Annotation[] getAnnotations()

Возвращает массив, содержащий все аннотации, связанные с вызывающим объектом

Annotation[] getDeclaredAnnota-tions()

Возвращает массив, содержащий все неунаследованные аннотации, связанные с вызывающим объектом

Boolean isAnnotationPre-sent(Class<? extends Annotation> annoType)

Возвращает значение true, если аннотация заданного типа annoType связана с вызывающим объектом. В противном случае возвращает false