Понравилась презентация – покажи это...
Reflection Java Advanced
Java Advanced / Reflection Содержание Введение Структура класса Массивы Загрузчики классов Proxy Заключение
Java Advanced / Reflection Reflection Библиотека, позволяющая оперировать информацией о типах во время выполнения Пакеты java.lang java.lang.reflect
Введение Часть 1
Java Advanced / Reflection Информация о типе Информация о типах классом Class Предоставляемая информация Структура класса Структура наследования Проверки времени выполнения …
Java Advanced / Reflection Типы типов Для определения типов служат методы вида is*()
Java Advanced / Reflection Получение информации о типе Во время исполнения object.getClass() Во время компиляции type.class Предопределенные Wrapper.TYPE
Java Advanced / Reflection Общая информация о классе Имя класса getCanonicalName() – каноническое имя getName() – полное имя getSimpleName() – простое имя Структура классов getSuperClass() – предок getInterfaces() – реализуемые интерфейсы Модификаторы getModifiers() – модификаторы
Java Advanced / Reflection Место определения класса Методы получения места, в котором определен класс
Java Advanced / Reflection Приведение классов Приведение cast(object) – привести ссылку к типу Определение возможности приведения isAssignableFrom(class) – класса isInstance(object) – объекта
Структура класса Часть 2
Java Advanced / Reflection Информация о члене класса Интерфейс Member Методы getDeclaringClass() – класс, в котором определен getName() – имя члена getModifiers() – модификаторы
Java Advanced / Reflection Модификаторы Класс Modifiers
Java Advanced / Reflection Поля Открытые getFields() – все поля getField(name) – конкретное поле Все getDeclaredFields() – все поля getDeclaredField(name) – конкретное поле Исключения NoSuchFieldException
Java Advanced / Reflection Свойства полей Класс Field Информация getName() – имя поля getType() – тип значения Чтение значения get(object) – ссылки get*(object) – значения примитивного типа Запись значения set(object, value) – ссылки set*(object, value) – значения примитивного типа
Java Advanced / Reflection Методы Открытые getMethods() – все методы getMethod(name, Class… parameters) – конкретный метод Все getDeclaredMethods() – все методы getDeclaredMethod(name , Class… parameters) – конкретный метод Исключения NoSuchMethodException
Java Advanced / Reflection Свойства методов Класс Method Сигнатура метода getName() – имя метода getParameterTypes() – параметры метода Другая информация getExceptionTypes() – возможные исключения getReturnType() – тип возвращаемого значения Вызов метода invoke(Object object, Object …args) – вызвать метод с указанными аргументами
Java Advanced / Reflection Конструкторы Открытые getConstructor() – все конструкторы getConstructor(Class… parameters) – конкретный конструктор Все getDeclaredConstructor() – все конструкторы getDeclaredConstructor(name , Class… parameters) – конкретный конструктор Исключения NoSuchMethodException
Java Advanced / Reflection Свойства конструкторов Класс Constructor Информация о конструкторе getParameterTypes() – параметры конструктора getExceptionTypes() – возможные исключения Создание объекта newInstance(Object … args) – создать новый объект class.newInstance() – создать новый объект используя конструктор по умолчанию
Java Advanced / Reflection Классы и интерфейсы Открытые getClasses() – все классы и интерфейсы Все getDeclaredClasses() – все классы и интерфейсы
Java Advanced / Reflection Доступ к закрытым членам По умолчанию доступ к закрытым членам запрещен ? IllegalAccessException Все члены extends AccessibleObject setAccessible(boolean) – запросить доступ isAccessible() – проверить доступ
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); }
Java Advanced / Reflection Пример: создание экземпляра // Получение класса Class clazz = Integer.class; // Получение конструктора Constructor c = clazz.getConstructor(int.class); // Создание экземпляра Integer i = (Integer) c.newInstance(100); // Проверка System.out.println(i);
Массивы Часть 3
Java Advanced / Reflection Операции с массивами Класс Array Создание массива заданного типа newInstance(Class, length) – линейного newInstance(Class, dims[]) – “кубического” Чтение значения из массива get(array, index) – ссылки get*(array, index) – значения примитивного типа Запись значения в массив set(array, index, value) – ссылки set*(array, index , value) – значения примитивного типа
Java Advanced / Reflection Массивы как типы Имя типа массива [имя_типа_элемента Методы isArray() – является ли массивом getComponentType() – тип элемента массива
Java Advanced / Reflection Имена для типов Имена классов типов в массиве кодируются специальным образом
Загрузчики классов Часть 4
Java Advanced / Reflection Загрузчики классов Позволяют загружать и определять новые классы Класс ClassLoader Методы loadClass(name, resolve?) – загружает класс по имени findLoadedClass(name) – найти уже загруженный класс resolveClass(class) – загружает библиотеки
Java Advanced / Reflection Дерево загрузчиков Загрузчики образуют дерево Загрузчики в разных ветвях могут загрузить разные классы с одним полным именем
Java Advanced / Reflection Дополнительные возможности Получения родителя getParent() Загрузка ресурсов URL getResouce(String name) – определение местоположения ресурса по имени getResouceAsStream(String name) – чтение ресурса по имени
Java Advanced / Reflection Загрузчики и классы Получение загрузчика getClassLoader() – кто загрузил класс Thread.getContextClassLoader() – контекстный загрузчик “Прямая” загрузка класса Class.forName(name)
Java Advanced / Reflection Реализации загрузчиков Класс URLClassLoader Загружает классы из нескольких мест, заданных URL
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"});
Proxy Часть 5
Java Advanced / Reflection Proxy Механизм, позволяющий создавать фиктивные классы, реализующие требуемые интерфейсы Класс Proxy
Java Advanced / Reflection Класс InvocationHandler Ему делегируются вызовы, совершенные для Proxy Методы invoke(Object proxy, Method, Object[] args) – уведомляет о вызове метода
Java Advanced / Reflection Методы Proxy Создание экземпляра Proxy newProxyInstance(ClassLoader, Class[] interfaces, InvocationHandler) Получение класса Proxy getProxyClass(ClassLoader, Class[] interfaces) Проверка класса isProxyClass(Class)
Java Advanced / Reflection Пример: профайлер (1) Класс public class Profiler implements InvocationHandler { // Экземпляр Proxy private final Object instance; // Реальная реализация private final Object impl; … }
Java Advanced / Reflection Пример: профайлер (2) Конструктор public Profiler(Class[] i8s, Object impl) { this.impl = impl; instance = Proxy.newProxyInstance(null, i8s, this); } Создание экземпляра public Object getInstance() { return instance; }
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); }
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)); }
Заключение Часть 6
Java Advanced / Reflection Выводы Reflection позволяет Анализировать классы по время исполнения Загружать классы по имени Создавать экземпляры классов по имени Вызывать метод классов по имени Оперировать значениями полей по имени Создавать и оперировать с массивами по типу элемента Создавать proxy для интерфейсов
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
Java Advanced / Reflection Вопросы
Или вы можете войти через Ваш аккаунт
У вас нет аккаунта? Создать аккаунт