logo

Јава Рефлецтион АПИ

Јава Рефлецтион је процес испитивања или модификације понашања класе у времену извођења .

Тхе јава.ланг.Цласс цласс пружа многе методе које се могу користити за добијање метаподатака, испитивање и промену понашања класе током извршавања.

Пакети јава.ланг и јава.ланг.рефлецт пружају класе за јава рефлексију.

Где се користи

Рефлецтион АПИ се углавном користи у:

  • ИДЕ (Интегрисано развојно окружење) нпр. Ецлипсе, МиЕцлипсе, НетБеанс итд.
  • Дебуггер
  • Алати за тестирање итд.
Да ли знаш?
  • На колико начина можемо добити инстанцу класе Цласс?
  • Како направити јавап алат?
  • Како направити алатку апплетвиевер?
  • Како приступити приватној методи изван класе?

јава.ланг.Цласс цласс

Класа јава.ланг.Цласс углавном обавља два задатка:

Кат тимпф
  • пружа методе за добијање метаподатака класе у време извршавања.
  • пружа методе за испитивање и промену понашања класе у времену извођења.

Често коришћене методе класе класе:

МетодОпис
1) јавни стринг гетНаме()враћа име класе
2) јавна статичка Цласс форНаме(Стринг цлассНаме) баца ЦлассНотФоундЕкцептионучитава класу и враћа референцу класе Цласс.
3) јавни објекат невИнстанце() баца ИнстантиатионЕкцептион, ИллегалАццессЕкцептионствара нову инстанцу.
4) јавни логички исИнтерфаце()проверава да ли је то интерфејс.
5) јавни логички исАрраи ();проверава да ли је низ.
6) јавни логички исПримитиве()проверава да ли је примитиван.
7) јавна класа гетСуперцласс()враћа референцу класе суперкласе.
8) публиц Фиелд[] гетДецларедФиелдс() баца СецуритиЕкцептионвраћа укупан број поља ове класе.
9) публиц Метход[] гетДецларедМетходс() баца СецуритиЕкцептионвраћа укупан број метода ове класе.
10) јавни конструктор[] гетДецларедЦонструцторс() баца СецуритиЕкцептионвраћа укупан број конструктора ове класе.
11) јавни метод гетДецларедМетход(стринг наме,Цласс[] параметерТипес)избацује НоСуцхМетходЕкцептион,СецуритиЕкцептионвраћа инстанцу класе методе.

Како добити објекат класе Цласс?

Постоје 3 начина да добијете инстанцу класе Цласс. Они су следећи:

  • форНаме() метода класе Цласс
  • гетЦласс() метода класе Објецт
  • синтаксу .цласс

1) форНаме() метода класе Цласс

  • се користи за динамичко учитавање класе.
  • враћа инстанцу класе Цласс.
  • Требало би да се користи ако знате потпуно квалификовано име класе. Ово се не може користити за примитивне типове.

Погледајмо једноставан пример методе форНаме().

Назив документа: Тест.јава

инт то цхар јава
 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) гетЦласс() метод класе Објецт

Враћа инстанцу класе Цласс. Треба га користити ако познајете врсту. Штавише, може се користити са примитивима.

Назив документа: Тест.јава

 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 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 

Одређивање објекта класе

Следеће методе класе Цласс се користе за одређивање објекта класе:

1) јавни логички исИнтерфаце(): одређује да ли наведени објекат Цласс представља тип интерфејса.

2) јавни логички исАрраи(): одређује да ли овај објекат Цласс представља класу низа.

преоптерећење метода

3) јавни логички исПримитиве(): одређује да ли наведени објекат класе представља примитивни тип.

Хајде да видимо једноставан пример рефлексивног АПИ-ја за одређивање типа објекта.

Назив документа: Тест.јава

 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 

За и против рефлексије

Јава рефлексију увек треба користити са опрезом. Иако рефлексија пружа много предности, има и неке недостатке. Хајде да прво разговарамо о предностима.

Предности: Инспекција интерфејса, класа, метода и поља током времена извршавања је могућа помоћу рефлексије, чак и без коришћења њихових имена током времена компајлирања. Такође је могуће позвати методе, инстанцирати цлеар или поставити вредност поља користећи рефлексију. Помаже у креирању визуелног развојног окружења и претраживача класа који пружа помоћ програмерима да напишу исправан код.

Против: Користећи рефлексију, може се разбити принцип инкапсулације. Могуће је приступити приватним методама и пољима класе користећи рефлексију. Дакле, рефлексија може процурити важне податке у спољни свет, што је опасно. На пример, ако неко приступи приватним члановима класе и постави им вредност нулл, онда други корисник исте класе може добити изузетак НуллРеференцеЕкцептион, а ово понашање се не очекује.

Још један недостатак су режијски трошкови у перформансама. Пошто се типови у рефлексији решавају динамички, ЈВМ (Јава виртуелна машина) оптимизација не може да се догоди. Стога су операције које се изводе рефлексијама обично споре.

Закључак

Због горе наведених недостатака, генерално је препоручљиво избегавати коришћење рефлексије. То је напредна функција коју би требало да користе само програмери или програмери који добро познају основе језика. Имај на уму! Кад год се користи рефлексија, безбедност апликације је угрожена.


Следећи водич за теме Рефлецтион АПИ-ја

невИнстанце() метода
Разумевање јавап алата
креирање јавап алата
креирање алата апплетвиевер
Позовите приватни метод из друге класе