Содержание

Слайд 2

Java Advanced / Collections Framework

Содержание

Введение
Структура класса
Массивы
Загрузчики классов
Параметры типов
Proxy
Заключение

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

Слайд 3

Java Advanced / Collections Framework

Reflection

Библиотека, позволяющая оперировать информацией о типах во время

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

Слайд 4

Введение

Часть 1

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

Слайд 5

Java Advanced / Collections Framework

Информация о типе

Класс Class -- информация о типе
Предоставляемая

Java Advanced / Collections Framework Информация о типе Класс Class -- информация
информация
Структура класса
Структура наследования
Проверки времени выполнения

Слайд 6

Java Advanced / Collections Framework

Получение информации о типе

Во время исполнения
object.getClass()
Во время

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

Слайд 7

Java Advanced / Collections Framework

Типы типов

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

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

Слайд 8

Java Advanced / Collections Framework

Общая информация о классе

Имя класса
getCanonicalName() – каноническое имя
getName()

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

Слайд 9

Java Advanced / Collections Framework

Место определения класса

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

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

Слайд 10

Java Advanced / Collections Framework

Приведение типов

Определение возможности приведения
isAssignableFrom(class) – класса
isInstance(object) –

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

Слайд 11

Структура класса

Часть 2

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

Слайд 12

Java Advanced / Collections Framework

Информация о члене класса

Интерфейс Member
Методы
getDeclaringClass() – класс, в

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

Слайд 13

Java Advanced / Collections Framework

Модификаторы

Класс Modifiers

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

Слайд 14

Java Advanced / Collections Framework

Поля

Открытые
getFields() – все поля
getField(name) – конкретное поле
Все
getDeclaredFields() –

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

Слайд 15

Java Advanced / Collections Framework

Свойства полей

Класс Field
Информация
getName() – имя поля
getType() – тип

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

Слайд 16

Java Advanced / Collections Framework

Методы

Открытые
getMethods() – все методы
getMethod(name, Class… parameters) – конкретный

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

Слайд 17

Java Advanced / Collections Framework

Свойства методов

Класс Method
Сигнатура метода
getName() – имя метода
getParameterTypes() –

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

Слайд 18

Java Advanced / Collections Framework

Конструкторы

Открытые
getConstructors() – все конструкторы
getConstructor(Class… parameters) – конкретный конструктор
Все
getDeclaredConstructors()

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

Слайд 19

Java Advanced / Collections Framework

Свойства конструкторов

Класс Constructor
Информация о конструкторе
getParameterTypes() – параметры конструктора
getExceptionTypes()

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

Слайд 20

Java Advanced / Collections Framework

Классы и интерфейсы

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

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

Слайд 21

Java Advanced / Collections Framework

Доступ к закрытым членам

По умолчанию доступ к закрытым

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

Слайд 22

Java Advanced / Collections Framework

Пример: листинг класса

Class c = …;
for (Field m

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

Слайд 23

Java Advanced / Collections Framework

Пример: создание экземпляра

// Получение класса
Class clazz = Integer.class;
//

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

Слайд 24

Массивы

Часть 3

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

Слайд 25

Java Advanced / Collections Framework

Операции с массивами

Класс Array
Создание массива заданного типа
newInstance(Class, length)

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

Слайд 26

Java Advanced / Collections Framework

Массивы как типы

Имя типа массива
[имя_типа_элемента
Методы
isArray() – является ли

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

Слайд 27

Java Advanced / Collections Framework

Имена для типов

Имена классов типов в массиве кодируются

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

Слайд 28

Загрузчики классов

Часть 4

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

Слайд 29

Java Advanced / Collections Framework

Загрузчики классов

Позволяют загружать и определять новые классы
Класс ClassLoader
Методы
loadClass(name,

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

Слайд 30

Java Advanced / Collections Framework

Дерево загрузчиков

Загрузчики образуют дерево
Загрузчики в разных ветвях могут

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

Слайд 31

Java Advanced / Collections Framework

Дополнительные возможности

Получения родителя
getParent()
Загрузка ресурсов
URL getResource(String name) – определение

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

Слайд 32

Java Advanced / Collections Framework

Загрузчики и классы

Получение загрузчика
getClassLoader() – кто загрузил класс
Thread.getContextClassLoader()

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

Слайд 33

Java Advanced / Collections Framework

Реализации загрузчиков

Класс URLClassLoader
Загружает классы из нескольких мест, заданных

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

Слайд 34

Java Advanced / Collections Framework

Пример: загрузка класса

URL jar = new URL("file://.");
className =

Java Advanced / Collections Framework Пример: загрузка класса URL jar = new
"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"});

Слайд 35

Параметры типов

Часть 5

Параметры типов Часть 5

Слайд 36

Java Advanced / Collections Framework

Информация о параметрах типов (ПТ)

Информация о конкретных параметрах

Java Advanced / Collections Framework Информация о параметрах типов (ПТ) Информация о
типов стирается
Информация о зависимостях типов сохраняется

Слайд 37

Java Advanced / Collections Framework

Получение информация о ПТ

Для классов
getGenericSuperclass()
getGenericInterfaces()
Для методов и конструкторов
getGenericParameterTypes()
getGenericReturnType()
getGenericExceptionTypes()
Для

Java Advanced / Collections Framework Получение информация о ПТ Для классов getGenericSuperclass()
полей
getGenericType()

Слайд 38

Java Advanced / Collections Framework

Представление информации о ПТ

Интерфейс Type
Классы Class
Параметризованный класс ParameterizedType
Переменная типа TypeVariable
Wildcard WildcardType
Массивы GenericArrayType

Java Advanced / Collections Framework Представление информации о ПТ Интерфейс Type Классы

Слайд 39

Java Advanced / Collections Framework

Параметризованные классы

Пример: Collection
Интерфейс ParameterizedType
getRawType() – не параметризованный тип
getActualTypeArguments()

Java Advanced / Collections Framework Параметризованные классы Пример: Collection Интерфейс ParameterizedType getRawType()
– реальные аргументы типа

Слайд 40

Java Advanced / Collections Framework

Переменные типа

Пример: T
Получение
getTypeParameters()
Интерфейс TypeVariable
getName() – имя переменной
getBounds() –

Java Advanced / Collections Framework Переменные типа Пример: T Получение getTypeParameters() Интерфейс
верхние границы
getGenericDeclaration() – кто объявил

Слайд 41

Java Advanced / Collections Framework

Wildcards

Пример: ? super HashSet extends Collection
Интерфейс Wildcard
getUpperBounds() –

Java Advanced / Collections Framework Wildcards Пример: ? super HashSet extends Collection
Верхние границы
getLowerBounds() – Нижние границы

Слайд 42

Java Advanced / Collections Framework

Массивы

Тип элемента – переменная типа
Пример: T[]
Тип элемента –

Java Advanced / Collections Framework Массивы Тип элемента – переменная типа Пример:
параметризованный тип
Пример: Set[]
Интерфейс GenericArrayType
getGenericComponentType() – тип элемента

Слайд 43

Proxy

Часть 6

Proxy Часть 6

Слайд 44

Java Advanced / Collections Framework

Proxy

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

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

Слайд 45

Java Advanced / Collections Framework

Класс InvocationHandler

Ему делегируются вызовы, совершенные для Proxy
Методы
invoke(Object proxy,

Java Advanced / Collections Framework Класс InvocationHandler Ему делегируются вызовы, совершенные для
Method method, Object[] args) – уведомляет о вызове метода

Слайд 46

Java Advanced / Collections Framework

Методы Proxy

Создание экземпляра Proxy
newProxyInstance(ClassLoader, Class[] interfaces, InvocationHandler)
Получение класса

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

Слайд 47

Java Advanced / Collections Framework

Пример: профайлер (1)

Класс
public class Profiler implements InvocationHandler {

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

}

Слайд 48

Java Advanced / Collections Framework

Пример: профайлер (2)

Конструктор
public Profiler(Class[] i8s, Object impl) {

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

Слайд 49

Java Advanced / Collections Framework

Пример: профайлер (3)

Основной метод
public Object invoke(
Object proxy, Method

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

Слайд 50

Java Advanced / Collections Framework

Пример: профайлер (4)

Применение
public static void main(String[] args) {
Integer

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

Слайд 51

Заключение

Часть 7

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

Слайд 52

Java Advanced / Collections Framework

Выводы

Reflection позволяет
Анализировать классы по время исполнения
Загружать классы по

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

Слайд 53

Java 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
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
Имя файла: Reflection.pptx
Количество просмотров: 169
Количество скачиваний: 0