'

Reflection

Понравилась презентация – покажи это...





Слайд 0

Reflection Java Advanced


Слайд 1

Java Advanced / Reflection Содержание Введение Структура класса Массивы Загрузчики классов Proxy Заключение


Слайд 2

Java Advanced / Reflection Reflection Библиотека, позволяющая оперировать информацией о типах во время выполнения Пакеты java.lang java.lang.reflect


Слайд 3

Введение Часть 1


Слайд 4

Java Advanced / Reflection Информация о типе Информация о типах классом Class Предоставляемая информация Структура класса Структура наследования Проверки времени выполнения …


Слайд 5

Java Advanced / Reflection Типы типов Для определения типов служат методы вида is*()


Слайд 6

Java Advanced / Reflection Получение информации о типе Во время исполнения object.getClass() Во время компиляции type.class Предопределенные Wrapper.TYPE


Слайд 7

Java Advanced / Reflection Общая информация о классе Имя класса getCanonicalName() – каноническое имя getName() – полное имя getSimpleName() – простое имя Структура классов getSuperClass() – предок getInterfaces() – реализуемые интерфейсы Модификаторы getModifiers() – модификаторы


Слайд 8

Java Advanced / Reflection Место определения класса Методы получения места, в котором определен класс


Слайд 9

Java Advanced / Reflection Приведение классов Приведение cast(object) – привести ссылку к типу Определение возможности приведения isAssignableFrom(class) – класса isInstance(object) – объекта


Слайд 10

Структура класса Часть 2


Слайд 11

Java Advanced / Reflection Информация о члене класса Интерфейс Member Методы getDeclaringClass() – класс, в котором определен getName() – имя члена getModifiers() – модификаторы


Слайд 12

Java Advanced / Reflection Модификаторы Класс Modifiers


Слайд 13

Java Advanced / Reflection Поля Открытые getFields() – все поля getField(name) – конкретное поле Все getDeclaredFields() – все поля getDeclaredField(name) – конкретное поле Исключения NoSuchFieldException


Слайд 14

Java Advanced / Reflection Свойства полей Класс Field Информация getName() – имя поля getType() – тип значения Чтение значения get(object) – ссылки get*(object) – значения примитивного типа Запись значения set(object, value) – ссылки set*(object, value) – значения примитивного типа


Слайд 15

Java Advanced / Reflection Методы Открытые getMethods() – все методы getMethod(name, Class… parameters) – конкретный метод Все getDeclaredMethods() – все методы getDeclaredMethod(name , Class… parameters) – конкретный метод Исключения NoSuchMethodException


Слайд 16

Java Advanced / Reflection Свойства методов Класс Method Сигнатура метода getName() – имя метода getParameterTypes() – параметры метода Другая информация getExceptionTypes() – возможные исключения getReturnType() – тип возвращаемого значения Вызов метода invoke(Object object, Object …args) – вызвать метод с указанными аргументами


Слайд 17

Java Advanced / Reflection Конструкторы Открытые getConstructor() – все конструкторы getConstructor(Class… parameters) – конкретный конструктор Все getDeclaredConstructor() – все конструкторы getDeclaredConstructor(name , Class… parameters) – конкретный конструктор Исключения NoSuchMethodException


Слайд 18

Java Advanced / Reflection Свойства конструкторов Класс Constructor Информация о конструкторе getParameterTypes() – параметры конструктора getExceptionTypes() – возможные исключения Создание объекта newInstance(Object … args) – создать новый объект class.newInstance() – создать новый объект используя конструктор по умолчанию


Слайд 19

Java Advanced / Reflection Классы и интерфейсы Открытые getClasses() – все классы и интерфейсы Все getDeclaredClasses() – все классы и интерфейсы


Слайд 20

Java Advanced / Reflection Доступ к закрытым членам По умолчанию доступ к закрытым членам запрещен ? IllegalAccessException Все члены extends AccessibleObject setAccessible(boolean) – запросить доступ isAccessible() – проверить доступ


Слайд 21

Java Advanced / Reflection Пример: листинг класса Class c = ArrayList.class; for (Field m : c.getDeclaredFields()) { System.out.println(m); } for (Constructor m : c.getDeclaredConstructors()) { System.out.println(m); } for (Method m : c.getDeclaredMethods()) { System.out.println(m); }


Слайд 22

Java Advanced / Reflection Пример: создание экземпляра // Получение класса Class clazz = Integer.class; // Получение конструктора Constructor c = clazz.getConstructor(int.class); // Создание экземпляра Integer i = (Integer) c.newInstance(100); // Проверка System.out.println(i);


Слайд 23

Массивы Часть 3


Слайд 24

Java Advanced / Reflection Операции с массивами Класс Array Создание массива заданного типа newInstance(Class, length) – линейного newInstance(Class, dims[]) – “кубического” Чтение значения из массива get(array, index) – ссылки get*(array, index) – значения примитивного типа Запись значения в массив set(array, index, value) – ссылки set*(array, index , value) – значения примитивного типа


Слайд 25

Java Advanced / Reflection Массивы как типы Имя типа массива [имя_типа_элемента Методы isArray() – является ли массивом getComponentType() – тип элемента массива


Слайд 26

Java Advanced / Reflection Имена для типов Имена классов типов в массиве кодируются специальным образом


Слайд 27

Загрузчики классов Часть 4


Слайд 28

Java Advanced / Reflection Загрузчики классов Позволяют загружать и определять новые классы Класс ClassLoader Методы loadClass(name, resolve?) – загружает класс по имени findLoadedClass(name) – найти уже загруженный класс resolveClass(class) – загружает библиотеки


Слайд 29

Java Advanced / Reflection Дерево загрузчиков Загрузчики образуют дерево Загрузчики в разных ветвях могут загрузить разные классы с одним полным именем


Слайд 30

Java Advanced / Reflection Дополнительные возможности Получения родителя getParent() Загрузка ресурсов URL getResouce(String name) – определение местоположения ресурса по имени getResouceAsStream(String name) – чтение ресурса по имени


Слайд 31

Java Advanced / Reflection Загрузчики и классы Получение загрузчика getClassLoader() – кто загрузил класс Thread.getContextClassLoader() – контекстный загрузчик “Прямая” загрузка класса Class.forName(name)


Слайд 32

Java Advanced / Reflection Реализации загрузчиков Класс URLClassLoader Загружает классы из нескольких мест, заданных URL


Слайд 33

Java Advanced / Reflection Пример: загрузка класса URL jar = new URL("file://."); className = "Test"; ClassLoader cl = new URLClassLoader(new URL[]{jar}); Class c = cl.loadClass(className); Method m = c.getMethod("main", String[].class); m.invoke(null, (Object) new String[]{"hello"});


Слайд 34

Proxy Часть 5


Слайд 35

Java Advanced / Reflection Proxy Механизм, позволяющий создавать фиктивные классы, реализующие требуемые интерфейсы Класс Proxy


Слайд 36

Java Advanced / Reflection Класс InvocationHandler Ему делегируются вызовы, совершенные для Proxy Методы invoke(Object proxy, Method, Object[] args) – уведомляет о вызове метода


Слайд 37

Java Advanced / Reflection Методы Proxy Создание экземпляра Proxy newProxyInstance(ClassLoader, Class[] interfaces, InvocationHandler) Получение класса Proxy getProxyClass(ClassLoader, Class[] interfaces) Проверка класса isProxyClass(Class)


Слайд 38

Java Advanced / Reflection Пример: профайлер (1) Класс public class Profiler implements InvocationHandler { // Экземпляр Proxy private final Object instance; // Реальная реализация private final Object impl; … }


Слайд 39

Java Advanced / Reflection Пример: профайлер (2) Конструктор public Profiler(Class[] i8s, Object impl) { this.impl = impl; instance = Proxy.newProxyInstance(null, i8s, this); } Создание экземпляра public Object getInstance() { return instance; }


Слайд 40

Java Advanced / Reflection Пример: профайлер (3) Основной метод public Object invoke( Object proxy, Method method, Object[] args ) throws IllegalAccessException, InvocationTargetException { System.out.println("Calling " + method + " on " + impl); return method.invoke(impl, args); }


Слайд 41

Java Advanced / Reflection Пример: профайлер (4) Применение public static void main(String[] args) { Integer i1 = new Integer(3); Profiler profiler = new Profiler( new Class[]{Comparable.class}, i1); Comparable i2 = (Comparable) profiler.getInstance(); System.out.println(i2.compareTo(i1)); }


Слайд 42

Заключение Часть 6


Слайд 43

Java Advanced / Reflection Выводы Reflection позволяет Анализировать классы по время исполнения Загружать классы по имени Создавать экземпляры классов по имени Вызывать метод классов по имени Оперировать значениями полей по имени Создавать и оперировать с массивами по типу элемента Создавать proxy для интерфейсов


Слайд 44

Java Advanced / Reflection Ссылки Reflection (Guide) // http://java.sun.com/j2se/1.5.0/docs/guide/reflection/index.html Reflection API Code Samples // http://java.sun.com/developer/codesamples/refl.html Using Java Reflection // http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html The Reflection API (tutorial) // http://java.sun.com/docs/books/tutorial/reflect/index.html


Слайд 45

Java Advanced / Reflection Вопросы


×

HTML:





Ссылка: