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

Использование значений по умолчанию

Вы можете передавать значения по умолчанию методам-членам аннотаций, которые будут использоваться, если не задано значение при вставке аннотации. Значение по умолчанию указывается с помощью ключевого слова default в объявлении метода-члена. Синтаксическая запись такого объявления приведена в следующей строке:

type member() default value;

В приведенной записи значение value должно иметь тип, совместимый с типом type.

Далее приведен фрагмент, в котором в объявление интерфейса @MyАnno включены значения по умолчанию:

// Объявление типа аннотации и включение в него значений по умолчанию. @Retention(RetentionPolicy.RUNTIME)

@interface MyAnno {

String str() default "Testing";

int val() default 9000;

}

В приведенном объявлении методу-члену str передается значение по умолчанию "Testing", а методу val — 9000. Это означает, что при использовании аннотации типа @MyАnno не нужно задавать никаких значений. Однако при желании каждому методу-члену или обоим можно передать другие значения. Далее приведены четыре варианта применения аннотации типа @MyAnno:

@МуАnnо() // для str и val используются значения по умолчанию

@MyAnno(str = "some String") // для val использовано значение по

// умолчанию

@MyAnno(val = 100) // для str использовано значение по умолчанию

@MyAnno(str = "Testing"/ val = 100) // не используются значения по

// умолчанию

В листинге 7.4. приведен пример программы, в которой демонстрируется применение значений по умолчанию в аннотации.

Листинге 7.4 Использование значений по умолчанию в аннотации

import java.lang.annotation.*;

import java.lang.reflect.*;

// An annotation type declaration and include defaults.

@Retention(RetentionPolicy.RUNTIME)

@interface MyAnno {

String str() default "Testing";

int val() default 9000;

}

class Meta3 {

// Annotate a method using the default values.

@MyAnno()

public static void myMeth() {

Meta3 ob = new Meta3();

// Obtain the annotation for this method

// and display the values of the members.

try {

Class c = ob.getClass();

Method m = c.getMethod("myMeth");

MyAnno anno = m.getAnnotation(MyAnno.class);

System.out.println(anno.str() + " " + anno.val());

} catch (NoSuchMethodException exc) {

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

}

}

public static void main(String args[]) {

myMeth();

}

}

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

Testing 9000

Аннотации-маркеры

Аннотация-маркер (marker annotation) — это специальный тип аннотации, не содержащий методов-членов. Единственная цель такой аннотации — пометить объявление. В этом случае достаточно присутствия аннотации. Лучше всего для проверки наличия аннотации-маркера использовать метод isAnnotationPresent(), который определен в интерфейсе AnnotatedElement и, следовательно, доступен для объектов типа Class, Field, Method, Constructor и Package.

В листинге 7.5 приведен пример применения аннотации-маркера. Для определения Присутствия маркера используется метод isAnnotationPresent ().

Поскольку у интерфейса аннотации-маркера нет методов-членов, достаточно определить его наличие.

Листинг 7.5. Применение аннотации-маркера

import java.lang.annotation.*;

import java.lang.reflect.*;

// A marker annotation.

@Retention(RetentionPolicy.RUNTIME)

@interface MyMarker { }

class Marker {

// Annotate a method using a marker.

// Notice that no ( ) is needed.

@MyMarker

public static void myMeth() {

Marker ob = new Marker();

try {

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

// Determine if the annotation is present.

if(m.isAnnotationPresent(MyMarker.class))

System.out.println("MyMarker is present.");

} catch (NoSuchMethodException exc) {

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

}

}

public static void main(String args[]) {

myMeth();

}

}

В приведенном далее выводе результатов работы программы из листинга 7.5 подтверждается наличие аннотации типа @MуMаrkеr:

MуMаrkеr is present.

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

@MyMarker

Не будет ошибкой применение пустых скобок, но они не нужны.