Reflexia

Definícia

Reflexia (reflection) je schopnosť spusteného programu skúmať svoju štruktúru, stav a okolie a na základe toho meniť svoje správanie. Samotné skúmanie programom svojej štruktúry a stavu sa nazýva introspekcia (introspection) — sebapozorovanie.

Príklad

Zoberme ako príklad program, v ktorom máme niekoľko rôznych objektov, pri ktorých je možné nastaviť farbu pomocou metódy setColor. Z nejakého dôvodu tieto objekty sú inštanciami rôznych tried, ktoré nemajú spoločného predka a ani neimplementujú spoločné rozhranie (napríklad sú definované v rôznych knižniciach). Našou úlohou je napísať metódu, ktorá bude nastavovať farbu pre ľubovoľný takýto objekt.

Pomocou reflexie môžeme danú úlohu vyriešiť nasledovne:

public static void setObjectColor(Object obj, Color color) {
    Class aClass = obj.getClass();
    try {
        Method method = aClass.getMethod("setColor", Color.class);
        method.invoke(obj, color);
    } catch (NoSuchMethodException ex) { ... }
      catch (IllegalAccessException ex) { ... }
      catch (InvocationTargetException ex) { ... }
}

Táto metóda využíva reflexiu v Jave na to, aby z dodaného objektu získala informácie o jeho triede (getClass) a metóde s požadovaným názvom a typom argumentu (getMethod). Následne môžeme túto metódu zavolať (invoke).

Realizácia reflexie

Ako je vidieť na príklade, informácie o štruktúre programu a jeho stave musia byť reprezentované nejakými objektmi. V Jave to sú objekty tried Class, Method, Field, Constructor a ďalších. Tieto objekty sú tiež nazývané metaobjekty a slúžia na získanie informácií o programe a tiež na zmenu jeho stavu (zmena hodnoty členskej premennej, zavolanie metódy). Viac informácií o ich získaní a používaní získate v odporúčanej literatúre.

Zdroje

Doplňujúce zdroje