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