java core-lect6-part3-annotation.ppt

Post on 14-Apr-2017

145 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Язык программирования JAVA

Лекция# 6 (Часть 3)Annotation

Моисеенко Антонcanggu@mail.ru

СПГУАПКафедра Информационно-Сетевых Технологий

Содержание курса

1. Аннотации2. Применение аннотаций 3. Примеры4. Стандартные аннотации5. Собственные аннотации6. Параметры аннотации7. Класс SimpleService8. Класс LazyService9. Обработчик аннотаций10. Чтение аннотаций

Аннотации

•Метаданные, описывающие код•Хранятся внутри кода•Не влияют на код напрямую – нужен как

минимум обработчик аннотаций

Альтернатива аннотациям – XML (описание хранится вне кода)

Применение аннотаций

•Информация для компилятора (@Deprecated etc)•Генерирование документации, файлов•Обработка во время выполнения

Примеры

@Bean(“MyBean”)public class MyClass {

@Deprecatedprivate int oldValue;

@Overridepublic String toString() {…}

}

Свойства аннотаций могут быть помечены ключами (key=“Value”), а могут быть и без них

Стандартные аннотации

@Deprecated – говорит компилятору, что метод не используется@Override – переопределяет метод суперкласса, иначе ошибка компиляции@SupressWarnings (“…”) – убирает warning, указанные свойствах

Распространенные аннотации других библиотек:@Test (@Before, @After)@Transactional, @Entity, @Autowire

Собственные аннотации

public @interface Service {

String name(); //становится обязательным свойствомBoolean lazyLoad() default false;

}

Сходство с интерфейсами:•Указываем методы, которые возвращают значения•Экземпляр аннотации создать нельзя

Собственные аннотации

•Методы всегда начинаются с маленькой буквы

•Методы не принимают аргументов

•Имя метода становится свойством аннотации

•Допустимы примитивные типы, String и массивы

•Cвойства со спецификатором default не обязательно упоминать в аннотации

Параметры аннотации

Аннотации над аннотациями:@DocumentedИнформация об аннотации и классе попадает в Javadoc

@InheritedДанная аннотация наследуется потомками класса. Без неё override

методы теряют нотацию в дочернем классе.

@Target (ElementType.TYPE) - Область примененияElementType.TYPE – над классами и интерфейсами

@Retention (RetentionPolicy.RUNTIME) - Время жизниRetentionPolicy.RUNTIME – означает, что аннотация будет

жить также и в Runtime

Параметры аннотации

Аннотации над аннотациями:

@TargetElementType.ANNOTATION_TYPE – только над другими аннотациямиElementType.CONSTRUCTOR – только над конструкторомElementType.FIELD – только над полем классаElementType.LOCAL_VARIABLE – только над локальной переменной

методаElementType.METHOD - только над методомElementType.PACKAGE – расспространяется на весь пакетElementType.PARAMETER – перед аргументом методаElementType.TYPE – аннотация может присутствовать над классом

или интерфейсом

Параметры аннотации

Аннотации над аннотациями:

@Retention

RetentionPolicy.SOURCE – может присутствовать только в исходном коде. Ни компилятор, ни интерпритатор не будут о ней знать. Используется для документации.

RetentionPolicy.CLASS – видна только во время компиляции

RetentionPolicy.RUNTIME - видна только в runtime

Параметры аннотации

Пример:Нужно загрузить, классы помеченные аннотацией

Service.

@Target(ElementType.Method)@Retention(RetentionPolicy.Runtime)Public @interface Init {

boolean suppressException() default false;}

Создавая объект, вызываем все методы помеченные аннотацией Init. На основании suppressException будем либо обрабатывать исключение, либо пробрасывать его дальше.

Параметры аннотации

Если lazyLoad == true, то не будем вызывать методы Init

SimpleService

+initService()

LazyService

+lazyInit() throws Exception

Класс SimpleService@Service (name="SuperSimpleService")public class SimpleService { protected int id; private String description = "The dscription of SimpleService"; @Init public void initService(){ System.out.println("SimpleService.initService() started"); } public void doNothing(){ System.out.println("SimpleService.doNothing() started"); } private String getDescription(){ return description; } protected int getId(){ return id; }}

Класс LazyService@Service (name="VeryLazyService")public class LazyService { @Init public void lazyInit() throws Exception{ System.out.println("LazyService.lazyInit() started"); }}

Для чего же нужны аннотации?Если хотим через аннотации помечать куски кода и динамически их обрабатывать.

Обработчик аннотаций

AnnotationProcessor.java

public class AnnotationProcessor { public static void main(String[] args){ inspectService(SimpleService.class); inspectService(LazyService.class); inspectService(String.class); } static void inspectService(Class<?> service){…}}

Чтение аннотацийМожно вызывать следующие методы у объекта класса Class, Field или Method

Boolean isAnnotationPresent( Class <? extends Annotation> ann);// проверяет наличие аннотаций в указанном классе

A getAnnotation(Class<A> ann); //возвращает аннотацию по имени классас установленными параметрами аннотации

Annotation[] getAnnotations(); //возвращает все аннотации, включая inherrited родительские аннотации

Annotation[] getDeclaredAnnotations(); //возвращает все аннотации определенные вашем коде

Чтение аннотаций

…if (service.isAnnotationPresent(Init.class)){ Service ann = service.getAnnotation(Service.class); System.out.println("Service annotation name = " + ann.name()); System.out.println("Service annotation lazyLoad = " + ann.lazyLoad());}Else { System.oum.printl(“No service annotation in class” + Service.class)}…

Вопросы?

top related