Рефлексія – це механізм дослідження даних про програму під час її виконання.
Пакет java.lang.reflect містить набір метакласів рефлексії (reflection), що дають змогу докладно дослідити будь-який тип Java.
Усі типи містяться в пакеті java.lang.reflect, за винятком класів Class та Package, які є частиною пакета java.lang.
Клас Class
Кожному типу Java – простим типам, класам, інтерфейсам та масивам – відповідає власний об'єкт класу Class.
Є також спеціальний об'єкт Class, який представляє службове слово void.
Об'єкти Class можуть використовуватися для отримання інформації про типи та, якщо тип належить до посилальних, для створення нових об'єктів цього типу.
Є чотири способи отримання об'єкта Class:
1) застосування методу getClass;
2) використання літерала типу Class (імені класу, що супроводжується суфіксом .class. Наприклад, String.class);
3) застосування статичного методу Class – forName із зазначенням повного імені класу, що містить назву пакета, якому він належить;
4) отримання даних за допомогою методів рефлексії, які повертають об'єкти Class для вкладених класів та інтерфейсів.
Інтерфейс Java Reflection API
Рефлексія у Java здійснюється за допомогою Java Reflection API. Цей інтерфейс API складається з класів пакетів: java.lang та java.lang.reflect.
За допомогою інтерфейсу Java Reflection API можна робити таке:
• Визначити клас об'єкта.
• Отримати інформацію про модифікатори класу, поля, методи, конструктори та суперкласи.
• З'ясувати, які константи та методи належать інтерфейсу.
• Створити екземпляр класу, ім'я якого невідоме до виконання програми.
• Отримати та встановити значення властивості об'єкта.
• Викликати метод об'єкта.
• Створити новий масив, розмір і тип компонентів якого невідомі до моменту виконання програм.
Методи класу Class
• public boolean islnterface() повертає true, якщо об'єкт Class є інтерфейсом.
• public boolean isArray() повертає true, якщо об'єкт Class є масивом.
• public boolean isPrimitive() повертає true, якщо об'єкт Class є одним із простих типів або службовим словом void.
• public Class[] getlnterfaces() повертає масив об'єктів Class, елементи якого відповідають інтерфейсам, що реалізовані поточним типом. Якщо базових інтерфейсів щодо до типу не існує, бо, наприклад, тип не реалізує інтерфейси безпосередньо або є простим, повертається масив нульової довжини.
• public Class getSuperclass() повертає об'єкт Class, який відповідає базовому класу щодо до поточного типу. Метод повертає null, якщо поточний об'єкт Class представляє клас Object, інтерфейс, простий тип або службове слово void (усі вони не мають базових класів).
• public int getModifiers() повертає модифікатори, що використовуються в оголошенні типу у вигляді кодованого цілочисельного значення. Значення має декодуватися за допомогою констант і методів класу Modifier.
• public Class getComponentType() повертає об'єкт класу Class, який представляє компонентний тип масиву, що описується поточним об'єктом Class.
Якщо поточний об'єкт Class не відповідає масиву, повертається null. Нехай, наприклад, заданий масив значень int;
Тоді метод getClass поверне об'єкт Class, для якого метод-запит isArray поверне значення true, а метод getComponentType – об'єкт int.class.
public static Class forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException повертає об'єкт Class, що відповідає названому на ім'я класу або інтерфейсу, за допомогою заданого завантажувача класів.
Використовуючи повне ім'я класу або інтерфейсу, яке передане як параметр name, метод робить спробу виявити та завантажити клас або інтерфейс.
Для завантаження класу або інтерфейсу застосовується заданий завантажувач класів.
Якщо значення параметра loader дорівнює null, використовується системний завантажувач класів.
Клас ініціалізується лише за умови, що значення параметра initialize дорівнює true, а ініціалізація класу раніше не виконувалася.
Якщо клас із заданим ім'ям не може бути знайдений, викидається оголошений виняток типу ClassNotFoundException.
• public Constructor[] getConstructors(),
• public Field[] getFields(),
• public Method[] getMethods(),
• public Class[] getClasses() – за допомогою цих методів можна отримати відомості про public – члени, які або оголошені в поточному класі (або інтерфейсі), або успадковані.
• public Constructor[ ] getDeclaredConstructors(),
• public Field[ ] getDeclaredFields(),
• public Method[ ] getDeclaredMethods(),
• public Class[ ] getDeclaredClasses() – за допомогою цих методів можна отримати дані про члени (не обов'язково зазначених як public) певної категорії, які оголошені в поточному класі (або інтерфейсі), але не успадковані.
• public Field getField(String name),
• public Field getDeclaredField(String name) – за допомогою цих методів можна отримати відомості про конкретний член класу.
• public Method getMethod(String name, Class[] parameterTypes),
• public Method getDeclaredMethod(String name, Class[] parameterTypes) – за допомогою цих методів можна отримати інформацію про конкретні методи класу, у масиві parameterTypes передаються типи параметрів методу.
• public Constructor getConstructor(Class[] parameterTypes),
• public Constructor getDeclaredConstructor(Class[] parameterTypes)
Класи Field, Constructor, Method
Кожен із класів Field, Constructor, Method реалізує інтерфейс Member, у складі якого оголошено три методи, які є загальними для всіх категорій членів класів:
• Class getDeclaringClass() повертає об'єкт Class, що відповідає класу, в якому оголошено поточний член.
• String getName() повертає найменування поточного члена.
• int getModifiers() повертає модифікатори, які використовуються в оголошенні члена, у вигляді кодованого цілочисельного значення. Значення має декодуватися за допомогою констант і методів класу Modifier.
Q&A
Дякую всім за заняття!🙌🏻
❗️🎓Тема уроку: 5. Reflection
Нагадую, що дедлайн здачі домашніх робіт – до наступного уроку.
Якщо виникають складнощі, пишіть, допоможу із задоволенням 😌
Запис лекції тренер опублікує трохи пізніше 🖥
Не забудьте повторити матеріал та підготуватися до наступного уроку📚
Успіху і до зустрічі!🤩
OOP. 1
Назва
Кількостей
Ціна
Рік виготовлення
Виробник
Визначити найдорожчий товар на складі та надрукувати всі відомості про нього.
OOP. 2
Назва
Частота
Об'єм оперативної пам'яті
Наявність DVD ROM
Вартість
Обчислити середню вартість усіх комп'ютерів і надрукувати найменування комп'ютерів та їхню середню вартість.
OOP. 3
Прізвище
Рік народження
Посада
Зарплата
Освіта
Визначити кількість працівників - інженерів і надрукувати всі відомості про них.