java core-lect6-part3-annotation.ppt

19

Click here to load reader

Upload: anton-moiseenko

Post on 14-Apr-2017

145 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Java core-lect6-part3-annotation.ppt

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

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

Моисеенко Антон[email protected]

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

Page 2: Java core-lect6-part3-annotation.ppt

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

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

Page 3: Java core-lect6-part3-annotation.ppt

Аннотации

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

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

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

Page 4: Java core-lect6-part3-annotation.ppt

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

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

Page 5: Java core-lect6-part3-annotation.ppt

Примеры

@Bean(“MyBean”)public class MyClass {

@Deprecatedprivate int oldValue;

@Overridepublic String toString() {…}

}

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

Page 6: Java core-lect6-part3-annotation.ppt

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

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

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

Page 7: Java core-lect6-part3-annotation.ppt

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

public @interface Service {

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

}

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

Page 8: Java core-lect6-part3-annotation.ppt

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

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

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

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

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

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

Page 9: Java core-lect6-part3-annotation.ppt

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

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

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

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

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

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

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

Page 10: Java core-lect6-part3-annotation.ppt

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

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

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

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

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

Page 11: Java core-lect6-part3-annotation.ppt

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

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

@Retention

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

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

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

Page 12: Java core-lect6-part3-annotation.ppt

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

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

Service.

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

boolean suppressException() default false;}

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

Page 13: Java core-lect6-part3-annotation.ppt

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

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

SimpleService

+initService()

LazyService

+lazyInit() throws Exception

Page 14: Java core-lect6-part3-annotation.ppt

Класс 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; }}

Page 15: Java core-lect6-part3-annotation.ppt

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

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

Page 16: Java core-lect6-part3-annotation.ppt

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

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){…}}

Page 17: Java core-lect6-part3-annotation.ppt

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

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

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

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

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

Page 18: Java core-lect6-part3-annotation.ppt

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

…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)}…

Page 19: Java core-lect6-part3-annotation.ppt

Вопросы?