logo

Java Reflection API

Java Reflection це процес перевірки або модифікації поведінки класу під час виконання .

The java.lang.Class class надає багато методів, які можна використовувати для отримання метаданих, перевірки та зміни поведінки класу під час виконання.

що таке спікер

Пакунки java.lang і java.lang.reflect надають класи для рефлексії Java.

Де використовується

Reflection API в основному використовується в:

  • IDE (інтегроване середовище розробки), наприклад, Eclipse, MyEclipse, NetBeans тощо.
  • Налагоджувач
  • Інструменти тестування тощо
Чи ти знаєш?
  • Скількома способами ми можемо отримати екземпляр класу Class?
  • Як створити інструмент javap?
  • Як створити інструмент перегляду аплетів?
  • Як отримати доступ до приватного методу поза класом?

java.lang.Class клас

Клас java.lang.Class виконує головним чином два завдання:

  • надає методи для отримання метаданих класу під час виконання.
  • надає методи для перевірки та зміни поведінки класу під час виконання.

Зазвичай використовувані методи класу Class:

методопис
1) загальнодоступний рядок getName()повертає назву класу
2) загальнодоступний статичний клас forName(String className) викидає ClassNotFoundExceptionзавантажує клас і повертає посилання на клас класу.
3) public Object newInstance() викидає InstantiationException, IllegalAccessExceptionстворює новий екземпляр.
4) public boolean isInterface()перевіряє, чи це інтерфейс.
5) відкритий логічний isArray();перевіряє, чи є він масивом.
6) public boolean isPrimitive()перевіряє, чи він примітивний.
7) публічний клас getSuperclass()повертає посилання на клас суперкласу.
8) public Field[] getDeclaredFields() викликає SecurityExceptionповертає загальну кількість полів цього класу.
9) public Method[] getDeclaredMethods() викликає SecurityExceptionповертає загальну кількість методів цього класу.
10) public Constructor[] getDeclaredConstructors() викликає SecurityExceptionповертає загальну кількість конструкторів цього класу.
11) відкритий метод getDeclaredMethod(String name,Class[] parameterTypes)викидає NoSuchMethodException,SecurityExceptionповертає екземпляр класу методу.

Як отримати об'єкт класу Class?

Є 3 способи отримати екземпляр класу Class. Вони такі:

  • метод forName() класу Class
  • метод getClass() класу Object
  • синтаксис .class

1) метод forName() класу Class

  • використовується для динамічного завантаження класу.
  • повертає екземпляр класу Class.
  • Його слід використовувати, якщо ви знаєте повну назву класу. Це не можна використовувати для примітивних типів.

Давайте розглянемо простий приклад методу forName().

Ім'я файлу: Test.java

 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Вихід:

 Simple 

2) метод getClass() класу Object

Він повертає екземпляр класу Class. Його слід використовувати, якщо ви знаєте тип. Крім того, його можна використовувати з примітивами.

Ім'я файлу: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Вихід:

Simple 

3) Синтаксис .class

Якщо тип доступний, але екземпляр відсутній, можна отримати клас, додавши '.class' до імені типу. Його також можна використовувати для примітивних типів даних.

Ім'я файлу: Test.java

 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Вихід:

 boolean Test 

Визначення об'єкта класу

Для визначення об’єкта класу використовуються такі методи класу Class:

1) загальнодоступний логічний isInterface(): визначає, чи вказаний об'єкт Class представляє тип інтерфейсу.

2) відкритий логічний isArray(): визначає, чи цей об'єкт Class представляє клас масиву.

3) public boolean isPrimitive(): визначає, чи вказаний об'єкт Class представляє примітивний тип.

актор Чиранджіві

Давайте розглянемо простий приклад API відображення для визначення типу об’єкта.

Ім'я файлу: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Вихід:

 false true 

Плюси і мінуси рефлексії

Відображення Java завжди слід використовувати з обережністю. Хоча відображення дає багато переваг, воно також має деякі недоліки. Давайте спочатку обговоримо переваги.

Плюси: Перевірка інтерфейсів, класів, методів і полів під час виконання можлива за допомогою відображення, навіть без використання їхніх імен під час компіляції. Також можна викликати методи, створити екземпляр кліру або встановити значення полів за допомогою відображення. Це допомагає у створенні візуальних середовищ розробки та браузерів класів, що надає допомогу розробникам у написанні правильного коду.

Мінуси: Використовуючи рефлексію, можна порушити принципи інкапсуляції. Можна отримати доступ до приватних методів і полів класу за допомогою відображення. Таким чином, відображення може призвести до витоку важливих даних у зовнішній світ, що є небезпечним. Наприклад, якщо один отримує доступ до приватних членів класу та встановлює для нього нульове значення, тоді інший користувач того самого класу може отримати виняток NullReferenceException, і така поведінка не очікується.

Ще одним недоліком є ​​накладні витрати на продуктивність. Оскільки типи у відображенні вирішуються динамічно, оптимізація JVM (віртуальна машина Java) не може відбутися. Тому операції, які виконуються відображеннями, зазвичай повільні.

Висновок

Через вищезазначені недоліки, як правило, бажано уникати використання відображення. Це розширена функція, якою повинні користуватися лише програмісти або розробники, які добре знають основи мови. Завжди пам'ятай! Щоразу, коли використовується відображення, безпека програми порушується.


Наступний підручник API Topics of Reflection

метод newInstance().
Розуміння інструменту javap
створення інструменту javap
створення інструменту перегляду аплетів
Виклик приватного методу з іншого класу