Java SE - Reflection and Annotations.pptx
- Количество слайдов: 23
Рефлексия и Аннотации © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018
План занятия • Рефлексия • Определение • Участники механизма рефлексии • Получение и использование информации о классе • Аннотации • • Определение Синтаксис Стандартные аннотации Варианты использования © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 2
Рефлексия © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018
Рефлексия. Определение Рефлексия (от лат. reflexio - обращение назад) - механизм исследования данных о программе во время её выполнения. Позволяет исследовать информацию о классах и выполнять операции над полями и методами используемых классов. Java Reflection API – набор классов из пакетов java. lang и java. lang. reflect © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 4
Рефлексия. Участники механизма рефлексии Классы пакета java. lang § Class § Класс является метаклассом по отношению к другим типам § Экземпляры класса Class описывают классы и интерфейсы выполняемого приложения § Методы класса Class позволяют исследовать содержимое описываемого класса и его свойства § Class. Loader § Реализует механизмы загрузки классов © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 5
Рефлексия. Участники механизма рефлексии Классы пакета java. lang. reflect § Field § Описывает поле объекта § Method § Описывает метод объекта § Constructor § Описывает конструктор объекта § Modifier § Инкапсулирует работу с модификаторами § Array § Инкапсулирует работу с массивами © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 6
Рефлексия. Использование информации о классе Получение объекта типа Class My. Class a = new My. Class(); Class c = a. get. Class(); Class c = My. Class. class; Class c = Class. for. Name("com. reflect. My. Class"); Получение имени класса String name = c. get. Name(); //com. reflect. My. Class String name = c. get. Simple. Name(); //My. Class © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 7
Рефлексия. Использование информации о классе Исследование модификаторов класса Class c = obj. get. Class(); int modifiers = c. get. Modifiers(); if (Modifier. is. Public(modifiers)) { System. out. println("public"); } if (Modifier. is. Abstract(modifiers)) { System. out. println("abstract"); } if (Modifier. is. Final(modifiers)) { System. out. println("final"); } Всего 12 Методов © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 8
Рефлексия. Использование информации о классе Исследование полей класса Class c = obj. get. Class(); Field[] public. Fields = c. get. Fields(); for (Field field : public. Fields) { Class field. Type = field. get. Type(); System. out. println("Имя: " + field. get. Name()); } Получение и изменение значения поля Class c = obj. get. Class(); Field field = c. get. Field(“my. Field"); String my. Field. Value = (String) field. get(obj); field. set(obj, "New value"); © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 9
Рефлексия. Использование информации о классе Исследование информации о методе Class c = obj. get. Class(); Method[] methods = c. get. Methods(); for (Method method : methods) {. . . method. get. Name(); . . . method. get. Return. Type(); for (Class param. Type : method. get. Parameter. Types()) {. . . param. Type. get. Name(); } } Вызов метода Class c = obj. get. Class(); Class[] param. Types = new Class[] {String. class}; Method method = c. get. Method(“get. Calc. Value", param. Types); Object[] args = new Object[]{new String(“Hello")}; Double d = (Double) method. invoke(obj, args); © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 10
Рефлексия. Использование информации о классе Создание экземпляра класса Class c = Class. for. Name("com. reflect. My. Class"); Object obj = c. new. Instance(); My. Class a = (My. Class) obj; © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 11
Аннотации © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018
Аннотации. Определение Аннотация – дескриптор, включаемый в текст программы, и используются для хранения метаданных, необходимых на разных этапах жизненного цикла программы. © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 13
Аннотации. Синтаксис Объявление аннотации: аннотации модификаторы @interface Имя. Аннотации { объявление_элемента_1 объявление_элемента_2. . . } Объявление элемента: тип имя. Элемента() default значение; © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 14
Аннотации. Синтаксис Допустимые типы элементов: 1. 2. 3. 4. 5. 6. Простой тип (int, short, long, byte, char, double, float, boolean) String Class Enum Аннотация Массив из приведенных выше типов © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 15
Аннотации. Синтаксис Пометить аннотацией можно: 1. 2. 3. 4. 5. 6. 7. 8. 9. Пакет Класс (включая Enum) Интерфейс аннотации Метод Конструктор Поля класса Параметры Локальные переменные © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 16
Аннотации. Синтаксис Пример: import java. lang. annotation. *; @Target(value=Element. Type. FIELD) @Retention(value= Retention. Policy. RUNTIME) public @interface Name { String name(); String type() default “string”; } © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 17
Аннотации. Синтаксис Варианты записи @Tested(name=”Alex”, date=” 20. 10. 2010”) Аннотацию, которая имеет только один элемент value, можно в следующей форме: @Color(Color. Type. RED) Если аннотация не имеет элементов, она называется аннотацией-маркером и записывается так: @Documented © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 18
Аннотации. Стандартные аннотации Аннотации для аннотаций @Retention (SOURCE, CLASS, RUNTIME) Указывает жизненный цикл аннотации. @Target (Type, Field, Method, Parameter, Constructor, Local Variable, Annotation Type, Package) Указывает объекты, которые могут быть помечены аннотацией. @Documented Маркер-аннотация. Указывает, что аннотация должна быть добавлена в javadoc @Inherited Маркер-аннотация. Помечает аннотацию, которая будет унаследована потомком класса, отмеченного такой аннотацией © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 19
Аннотации. Стандартные аннотации Другие стандартные аннотации @Deprecated Отмечает, что метод устарел @Suppress. Warnings(String[]) Указывает компилятору подавить предупреждения компиляции, определенные в параметрах аннотации @Override Проверяет, переопределен ли метод © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 20
Аннотации. Варианты использования • Маппинг данных Может выполняться на этапе компиляции или во время исполнения программы • Альтернатива (замена или расширение) интерфейсов исполняемых файлов (Runnable, Test) • AOP: Транзакции, права доступа, логирование, обработка исключений, проверка пре- и пост-условий См. библиотеки для AOP, например Aspect. J • Валидация данных @Validation(@Required, @Cammel. Case, @Regex(“[a-z]*”)) • Расширение комментариев, форматирование кода в IDE, статический анализ кода: @Not. Implelented, @Bug(91355846578574587), © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 21
Рекомендуемая литература “Core Java 2, Volume II – Advanced Features” – Horstmann, Cornell http: //docs. oracle. com http: //habrahabr. ru http: //quizful. net © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 22
Thank you! © 2011 Net. Cracker Technology Corp. Confidential. 2/12/2018 23