SlideShare a Scribd company logo
1 of 19
Язык программирования
JAVA
Лекция# 6 (Часть 3)
Annotation
Моисеенко Антон
canggu@mail.ru
СПГУАП
Кафедра Информационно-Сетевых Технологий
Содержание курса
1. Аннотации
2. Применение аннотаций
3. Примеры
4. Стандартные аннотации
5. Собственные аннотации
6. Параметры аннотации
7. Класс SimpleService
8. Класс LazyService
9. Обработчик аннотаций
10. Чтение аннотаций
Аннотации
• Метаданные, описывающие код
• Хранятся внутри кода
• Не влияют на код напрямую – нужен как
минимум обработчик аннотаций
Альтернатива аннотациям – XML (описание
хранится вне кода)
Применение аннотаций
• Информация для компилятора (@Deprecated etc)
• Генерирование документации, файлов
• Обработка во время выполнения
Примеры
@Bean(“MyBean”)
public class MyClass {
@Deprecated
private int oldValue;
@Override
public 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
Параметры аннотации
Аннотации над аннотациями:
@Target
ElementType.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)
}
…
Вопросы?

More Related Content

What's hot

Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
Technopark
 

What's hot (14)

Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
 
Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.Java Core. Lecture# 5. Concurrency.
Java Core. Lecture# 5. Concurrency.
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
C++ Базовый. Занятие 16.
C++ Базовый. Занятие 16. C++ Базовый. Занятие 16.
C++ Базовый. Занятие 16.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 

Similar to Java core-lect6-part3-annotation.ppt

презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
student_kai
 
Теория и практика обработки естественного языка
Теория и практика обработки естественного языкаТеория и практика обработки естественного языка
Теория и практика обработки естественного языка
Nikolay Karpov
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
Noveo
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
metaform
 

Similar to Java core-lect6-part3-annotation.ppt (20)

Аннотации в java
Аннотации в javaАннотации в java
Аннотации в java
 
Step 5
Step 5Step 5
Step 5
 
курс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключениякурс Java 2016. занятие 03. интерфейсы, generic, исключения
курс Java 2016. занятие 03. интерфейсы, generic, исключения
 
Авиком
АвикомАвиком
Авиком
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
Symfony 3
Symfony 3Symfony 3
Symfony 3
 
Спецкурс 2014, занятие 4. Конфиги, сборка, автотесты
Спецкурс 2014, занятие 4. Конфиги, сборка, автотестыСпецкурс 2014, занятие 4. Конфиги, сборка, автотесты
Спецкурс 2014, занятие 4. Конфиги, сборка, автотесты
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важно
 
Unit тесты java
Unit тесты javaUnit тесты java
Unit тесты java
 
Meeting #4. Frameworks.
Meeting #4. Frameworks.Meeting #4. Frameworks.
Meeting #4. Frameworks.
 
JUnit, дай пять!
JUnit, дай пять!JUnit, дай пять!
JUnit, дай пять!
 
Теория и практика обработки естественного языка
Теория и практика обработки естественного языкаТеория и практика обработки естественного языка
Теория и практика обработки естественного языка
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Symfony2 Best Practices
Symfony2 Best PracticesSymfony2 Best Practices
Symfony2 Best Practices
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 

Java core-lect6-part3-annotation.ppt

  • 1. Язык программирования JAVA Лекция# 6 (Часть 3) Annotation Моисеенко Антон canggu@mail.ru СПГУАП Кафедра Информационно-Сетевых Технологий
  • 2. Содержание курса 1. Аннотации 2. Применение аннотаций 3. Примеры 4. Стандартные аннотации 5. Собственные аннотации 6. Параметры аннотации 7. Класс SimpleService 8. Класс LazyService 9. Обработчик аннотаций 10. Чтение аннотаций
  • 3. Аннотации • Метаданные, описывающие код • Хранятся внутри кода • Не влияют на код напрямую – нужен как минимум обработчик аннотаций Альтернатива аннотациям – XML (описание хранится вне кода)
  • 4. Применение аннотаций • Информация для компилятора (@Deprecated etc) • Генерирование документации, файлов • Обработка во время выполнения
  • 5. Примеры @Bean(“MyBean”) public class MyClass { @Deprecated private int oldValue; @Override public String toString() {…} } Свойства аннотаций могут быть помечены ключами (key=“Value”), а могут быть и без них
  • 6. Стандартные аннотации @Deprecated – говорит компилятору, что метод не используется @Override – переопределяет метод суперкласса, иначе ошибка компиляции @SupressWarnings (“…”) – убирает warning, указанные свойствах Распространенные аннотации других библиотек: @Test (@Before, @After) @Transactional, @Entity, @Autowire
  • 7. Собственные аннотации public @interface Service { String name(); //становится обязательным свойством Boolean lazyLoad() default false; } Сходство с интерфейсами: •Указываем методы, которые возвращают значения •Экземпляр аннотации создать нельзя
  • 8. Собственные аннотации • Методы всегда начинаются с маленькой буквы • Методы не принимают аргументов • Имя метода становится свойством аннотации • Допустимы примитивные типы, String и массивы • Cвойства со спецификатором default не обязательно упоминать в аннотации
  • 9. Параметры аннотации Аннотации над аннотациями: @Documented Информация об аннотации и классе попадает в Javadoc @Inherited Данная аннотация наследуется потомками класса. Без неё override методы теряют нотацию в дочернем классе. @Target (ElementType.TYPE) - Область применения ElementType.TYPE – над классами и интерфейсами @Retention (RetentionPolicy.RUNTIME) - Время жизни RetentionPolicy.RUNTIME – означает, что аннотация будет жить также и в Runtime
  • 10. Параметры аннотации Аннотации над аннотациями: @Target ElementType.ANNOTATION_TYPE – только над другими аннотациями ElementType.CONSTRUCTOR – только над конструктором ElementType.FIELD – только над полем класса ElementType.LOCAL_VARIABLE – только над локальной переменной метода ElementType.METHOD - только над методом ElementType.PACKAGE – расспространяется на весь пакет ElementType.PARAMETER – перед аргументом метода ElementType.TYPE – аннотация может присутствовать над классом или интерфейсом
  • 11. Параметры аннотации Аннотации над аннотациями: @Retention RetentionPolicy.SOURCE – может присутствовать только в исходном коде. Ни компилятор, ни интерпритатор не будут о ней знать. Используется для документации. RetentionPolicy.CLASS – видна только во время компиляции RetentionPolicy.RUNTIME - видна только в runtime
  • 12. Параметры аннотации Пример: Нужно загрузить, классы помеченные аннотацией Service. @Target(ElementType.Method) @Retention(RetentionPolicy.Runtime) Public @interface Init { boolean suppressException() default false; } Создавая объект, вызываем все методы помеченные аннотацией Init. На основании suppressException будем либо обрабатывать исключение, либо пробрасывать его дальше.
  • 13. Параметры аннотации Если lazyLoad == true, то не будем вызывать методы Init SimpleService +initService() LazyService +lazyInit() throws Exception
  • 14. Класс 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; } }
  • 15. Класс LazyService @Service (name="VeryLazyService") public class LazyService { @Init public void lazyInit() throws Exception{ System.out.println("LazyService.lazyInit() started"); } } Для чего же нужны аннотации? Если хотим через аннотации помечать куски кода и динамически их обрабатывать.
  • 16. Обработчик аннотаций 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){…} }
  • 17. Чтение аннотаций Можно вызывать следующие методы у объекта класса Class, Field или Method Boolean isAnnotationPresent( Class <? extends Annotation> ann);// проверяет наличие аннотаций в указанном классе A getAnnotation(Class<A> ann); //возвращает аннотацию по имени классас установленными параметрами аннотации Annotation[] getAnnotations(); //возвращает все аннотации, включая inherrited родительские аннотации Annotation[] getDeclaredAnnotations(); //возвращает все аннотации определенные вашем коде
  • 18. Чтение аннотаций … 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) } …