Слайд 2Java Advanced / Collections Framework
Содержание
Введение
Структура класса
Массивы
Загрузчики классов
Параметры типов
Proxy
Заключение
![Java Advanced / Collections Framework Содержание Введение Структура класса Массивы Загрузчики классов Параметры типов Proxy Заключение](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-1.jpg)
Слайд 3Java Advanced / Collections Framework
Reflection
Библиотека, позволяющая оперировать информацией о типах во время
![Java Advanced / Collections Framework Reflection Библиотека, позволяющая оперировать информацией о типах](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-2.jpg)
выполнения
Пакеты
java.lang
java.lang.reflect
Слайд 5Java Advanced / Collections Framework
Информация о типе
Класс Class -- информация о типе
Предоставляемая
![Java Advanced / Collections Framework Информация о типе Класс Class -- информация](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-4.jpg)
информация
Структура класса
Структура наследования
Проверки времени выполнения
…
Слайд 6Java Advanced / Collections Framework
Получение информации о типе
Во время исполнения
object.getClass()
Во время
![Java Advanced / Collections Framework Получение информации о типе Во время исполнения](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-5.jpg)
компиляции
type.class
Предопределенные
Wrapper.TYPE
Слайд 7Java Advanced / Collections Framework
Типы типов
Для определения типов служат методы вида
is*()
![Java Advanced / Collections Framework Типы типов Для определения типов служат методы вида is*()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-6.jpg)
Слайд 8Java Advanced / Collections Framework
Общая информация о классе
Имя класса
getCanonicalName() – каноническое имя
getName()
![Java Advanced / Collections Framework Общая информация о классе Имя класса getCanonicalName()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-7.jpg)
– полное имя
getSimpleName() – простое имя
Структура классов
getSuperClass() – предок
getInterfaces() – реализуемые интерфейсы
Модификаторы
getModifiers() – модификаторы
Слайд 9Java Advanced / Collections Framework
Место определения класса
Методы получения места, в котором определен
![Java Advanced / Collections Framework Место определения класса Методы получения места, в котором определен класс](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-8.jpg)
класс
Слайд 10Java Advanced / Collections Framework
Приведение типов
Определение возможности приведения
isAssignableFrom(class) – класса
isInstance(object) –
![Java Advanced / Collections Framework Приведение типов Определение возможности приведения isAssignableFrom(class) –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-9.jpg)
объекта
Приведение
cast(object) – привести ссылку к типу
Слайд 12Java Advanced / Collections Framework
Информация о члене класса
Интерфейс Member
Методы
getDeclaringClass() – класс, в
![Java Advanced / Collections Framework Информация о члене класса Интерфейс Member Методы](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-11.jpg)
котором определен
getName() – имя члена
getModifiers() – модификаторы
Слайд 13Java Advanced / Collections Framework
Модификаторы
Класс Modifiers
![Java Advanced / Collections Framework Модификаторы Класс Modifiers](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-12.jpg)
Слайд 14Java Advanced / Collections Framework
Поля
Открытые
getFields() – все поля
getField(name) – конкретное поле
Все
getDeclaredFields() –
![Java Advanced / Collections Framework Поля Открытые getFields() – все поля getField(name)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-13.jpg)
все поля
getDeclaredField(name) – конкретное поле
Исключения
NoSuchFieldException
Слайд 15Java Advanced / Collections Framework
Свойства полей
Класс Field
Информация
getName() – имя поля
getType() – тип
![Java Advanced / Collections Framework Свойства полей Класс Field Информация getName() –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-14.jpg)
значения
Чтение значения
get(object) – ссылки
get*(object) – значения примитивного типа
Запись значения
set(object, value) – ссылки
set*(object, value) – значения примитивного типа
Слайд 16Java Advanced / Collections Framework
Методы
Открытые
getMethods() – все методы
getMethod(name, Class… parameters) – конкретный
![Java Advanced / Collections Framework Методы Открытые getMethods() – все методы getMethod(name,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-15.jpg)
метод
Все
getDeclaredMethods() – все методы
getDeclaredMethod(name , Class… parameters) – конкретный метод
Исключения
NoSuchMethodException
Слайд 17Java Advanced / Collections Framework
Свойства методов
Класс Method
Сигнатура метода
getName() – имя метода
getParameterTypes() –
![Java Advanced / Collections Framework Свойства методов Класс Method Сигнатура метода getName()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-16.jpg)
параметры метода
Другая информация
getExceptionTypes() – возможные исключения
getReturnType() – тип возвращаемого значения
Вызов метода
invoke(Object object, Object …args) – вызвать метод с указанными аргументами
Слайд 18Java Advanced / Collections Framework
Конструкторы
Открытые
getConstructors() – все конструкторы
getConstructor(Class… parameters) – конкретный конструктор
Все
getDeclaredConstructors()
![Java Advanced / Collections Framework Конструкторы Открытые getConstructors() – все конструкторы getConstructor(Class…](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-17.jpg)
– все конструкторы
getDeclaredConstructor(Class… parameters) – конкретный конструктор
Исключения
NoSuchMethodException
Слайд 19Java Advanced / Collections Framework
Свойства конструкторов
Класс Constructor
Информация о конструкторе
getParameterTypes() – параметры конструктора
getExceptionTypes()
![Java Advanced / Collections Framework Свойства конструкторов Класс Constructor Информация о конструкторе](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-18.jpg)
– возможные исключения
Создание объекта
newInstance(Object … args) – создать новый объект
class.newInstance() – создать новый объект используя конструктор по умолчанию
Слайд 20Java Advanced / Collections Framework
Классы и интерфейсы
Открытые
getClasses() – все классы и интерфейсы
Все
getDeclaredClasses()
![Java Advanced / Collections Framework Классы и интерфейсы Открытые getClasses() – все](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-19.jpg)
– все классы и интерфейсы
Слайд 21Java Advanced / Collections Framework
Доступ к закрытым членам
По умолчанию доступ к закрытым
![Java Advanced / Collections Framework Доступ к закрытым членам По умолчанию доступ](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-20.jpg)
членам запрещен ? IllegalAccessException
Все члены extends AccessibleObject
setAccessible(boolean) – запросить доступ
isAccessible() – проверить доступ
Слайд 22Java Advanced / Collections Framework
Пример: листинг класса
Class c = …;
for (Field m
![Java Advanced / Collections Framework Пример: листинг класса Class c = …;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-21.jpg)
: c.getDeclaredFields()) {
System.out.println(m);
}
for (Constructor m : c.getDeclaredConstructors()) {
System.out.println(m);
}
for (Method m : c.getDeclaredMethods()) {
System.out.println(m);
}
Слайд 23Java Advanced / Collections Framework
Пример: создание экземпляра
// Получение класса
Class clazz = Integer.class;
//
![Java Advanced / Collections Framework Пример: создание экземпляра // Получение класса Class](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-22.jpg)
Получение конструктора
Constructor c = clazz.getConstructor(int.class);
// Создание экземпляра
Integer i = (Integer) c.newInstance(100);
// Проверка
System.out.println(i);
Слайд 25Java Advanced / Collections Framework
Операции с массивами
Класс Array
Создание массива заданного типа
newInstance(Class, length)
![Java Advanced / Collections Framework Операции с массивами Класс Array Создание массива](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-24.jpg)
– линейного
newInstance(Class, dims[]) – “кубического”
Чтение значения из массива
get(array, index) – ссылки
get*(array, index) – значения примитивного типа
Запись значения в массив
set(array, index, value) – ссылки
set*(array, index , value) – значения примитивного типа
Слайд 26Java Advanced / Collections Framework
Массивы как типы
Имя типа массива
[имя_типа_элемента
Методы
isArray() – является ли
![Java Advanced / Collections Framework Массивы как типы Имя типа массива [имя_типа_элемента](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-25.jpg)
массивом
getComponentType() – тип элемента массива
Слайд 27Java Advanced / Collections Framework
Имена для типов
Имена классов типов в массиве кодируются
![Java Advanced / Collections Framework Имена для типов Имена классов типов в массиве кодируются специальным образом](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-26.jpg)
специальным образом
Слайд 29Java Advanced / Collections Framework
Загрузчики классов
Позволяют загружать и определять новые классы
Класс ClassLoader
Методы
loadClass(name,
![Java Advanced / Collections Framework Загрузчики классов Позволяют загружать и определять новые](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-28.jpg)
resolve?) – загружает класс по имени
findLoadedClass(name) – найти уже загруженный класс
resolveClass(class) – загружает библиотеки
Слайд 30Java Advanced / Collections Framework
Дерево загрузчиков
Загрузчики образуют дерево
Загрузчики в разных ветвях могут
![Java Advanced / Collections Framework Дерево загрузчиков Загрузчики образуют дерево Загрузчики в](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-29.jpg)
загрузить разные классы с одним полным именем
Слайд 31Java Advanced / Collections Framework
Дополнительные возможности
Получения родителя
getParent()
Загрузка ресурсов
URL getResource(String name) – определение
![Java Advanced / Collections Framework Дополнительные возможности Получения родителя getParent() Загрузка ресурсов](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-30.jpg)
местоположения ресурса по имени
getResourceAsStream(String name) – чтение ресурса по имени
Слайд 32Java Advanced / Collections Framework
Загрузчики и классы
Получение загрузчика
getClassLoader() – кто загрузил класс
Thread.getContextClassLoader()
![Java Advanced / Collections Framework Загрузчики и классы Получение загрузчика getClassLoader() –](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-31.jpg)
– контекстный загрузчик
“Прямая” загрузка класса
Class.forName(name)
Слайд 33Java Advanced / Collections Framework
Реализации загрузчиков
Класс URLClassLoader
Загружает классы из нескольких мест, заданных
![Java Advanced / Collections Framework Реализации загрузчиков Класс URLClassLoader Загружает классы из нескольких мест, заданных URL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-32.jpg)
URL
Слайд 34Java Advanced / Collections Framework
Пример: загрузка класса
URL jar = new URL("file://.");
className =
![Java Advanced / Collections Framework Пример: загрузка класса URL jar = new](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-33.jpg)
"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"});
Слайд 36Java Advanced / Collections Framework
Информация о параметрах типов (ПТ)
Информация о конкретных параметрах
![Java Advanced / Collections Framework Информация о параметрах типов (ПТ) Информация о](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-35.jpg)
типов стирается
Информация о зависимостях типов сохраняется
Слайд 37Java Advanced / Collections Framework
Получение информация о ПТ
Для классов
getGenericSuperclass()
getGenericInterfaces()
Для методов и конструкторов
getGenericParameterTypes()
getGenericReturnType()
getGenericExceptionTypes()
Для
![Java Advanced / Collections Framework Получение информация о ПТ Для классов getGenericSuperclass()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-36.jpg)
полей
getGenericType()
Слайд 38Java Advanced / Collections Framework
Представление информации о ПТ
Интерфейс Type
Классы Class
Параметризованный класс ParameterizedType
Переменная типа TypeVariable
Wildcard WildcardType
Массивы GenericArrayType
![Java Advanced / Collections Framework Представление информации о ПТ Интерфейс Type Классы](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-37.jpg)
Слайд 39Java Advanced / Collections Framework
Параметризованные классы
Пример: Collection
Интерфейс ParameterizedType
getRawType() – не параметризованный тип
getActualTypeArguments()
![Java Advanced / Collections Framework Параметризованные классы Пример: Collection Интерфейс ParameterizedType getRawType()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-38.jpg)
– реальные аргументы типа
Слайд 40Java Advanced / Collections Framework
Переменные типа
Пример: T
Получение
getTypeParameters()
Интерфейс TypeVariable
getName() – имя переменной
getBounds() –
![Java Advanced / Collections Framework Переменные типа Пример: T Получение getTypeParameters() Интерфейс](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-39.jpg)
верхние границы
getGenericDeclaration() – кто объявил
Слайд 41Java Advanced / Collections Framework
Wildcards
Пример: ? super HashSet extends Collection
Интерфейс Wildcard
getUpperBounds() –
![Java Advanced / Collections Framework Wildcards Пример: ? super HashSet extends Collection](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-40.jpg)
Верхние границы
getLowerBounds() – Нижние границы
Слайд 42Java Advanced / Collections Framework
Массивы
Тип элемента – переменная типа
Пример: T[]
Тип элемента –
![Java Advanced / Collections Framework Массивы Тип элемента – переменная типа Пример:](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-41.jpg)
параметризованный тип
Пример: Set[]
Интерфейс GenericArrayType
getGenericComponentType() – тип элемента
Слайд 44Java Advanced / Collections Framework
Proxy
Механизм, позволяющий создавать фиктивные классы, реализующие требуемые интерфейсы
Класс
![Java Advanced / Collections Framework Proxy Механизм, позволяющий создавать фиктивные классы, реализующие требуемые интерфейсы Класс Proxy](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-43.jpg)
Proxy
Слайд 45Java Advanced / Collections Framework
Класс InvocationHandler
Ему делегируются вызовы, совершенные для Proxy
Методы
invoke(Object proxy,
![Java Advanced / Collections Framework Класс InvocationHandler Ему делегируются вызовы, совершенные для](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-44.jpg)
Method method, Object[] args) – уведомляет о вызове метода
Слайд 46Java Advanced / Collections Framework
Методы Proxy
Создание экземпляра Proxy
newProxyInstance(ClassLoader, Class[] interfaces, InvocationHandler)
Получение класса
![Java Advanced / Collections Framework Методы Proxy Создание экземпляра Proxy newProxyInstance(ClassLoader, Class[]](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-45.jpg)
Proxy
getProxyClass(ClassLoader, Class[] interfaces)
Проверка класса
isProxyClass(Class)
Слайд 47Java Advanced / Collections Framework
Пример: профайлер (1)
Класс
public class Profiler implements InvocationHandler {
![Java Advanced / Collections Framework Пример: профайлер (1) Класс public class Profiler](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-46.jpg)
// Экземпляр Proxy
private final Object instance;
// Реальная реализация
private final Object impl;
…
}
Слайд 48Java Advanced / Collections Framework
Пример: профайлер (2)
Конструктор
public Profiler(Class[] i8s, Object impl) {
![Java Advanced / Collections Framework Пример: профайлер (2) Конструктор public Profiler(Class[] i8s,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-47.jpg)
this.impl = impl;
instance = Proxy.newProxyInstance(null,
i8s, this);
}
Создание экземпляра
public Object getInstance() {
return instance;
}
Слайд 49Java Advanced / Collections Framework
Пример: профайлер (3)
Основной метод
public Object invoke(
Object proxy, Method
![Java Advanced / Collections Framework Пример: профайлер (3) Основной метод public Object](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-48.jpg)
method, Object[] args
) throws IllegalAccessException, InvocationTargetException
{
System.out.println("Calling " + method +
" on " + impl);
return method.invoke(impl, args);
}
Слайд 50Java Advanced / Collections Framework
Пример: профайлер (4)
Применение
public static void main(String[] args) {
Integer
![Java Advanced / Collections Framework Пример: профайлер (4) Применение public static void](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-49.jpg)
i1 = new Integer(3);
Profiler profiler = new Profiler(
new Class[]{Comparable.class}, i1);
Comparable i2 =
(Comparable) profiler.getInstance();
System.out.println(i2.compareTo(i1));
}
Слайд 52Java Advanced / Collections Framework
Выводы
Reflection позволяет
Анализировать классы по время исполнения
Загружать классы по
![Java Advanced / Collections Framework Выводы Reflection позволяет Анализировать классы по время](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-51.jpg)
имени
Создавать экземпляры классов по имени
Вызывать метод классов по имени
Оперировать значениями полей по имени
Создавать и оперировать с массивами по типу элемента
Создавать proxy для интерфейсов
Слайд 53Java Advanced / Collections Framework
Ссылки
Reflection (Guide) // http://java.sun.com/j2se/1.5.0/docs/guide/reflection/index.html
Reflection API Code Samples //
![Java Advanced / Collections Framework Ссылки Reflection (Guide) // http://java.sun.com/j2se/1.5.0/docs/guide/reflection/index.html Reflection API](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/471384/slide-52.jpg)
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