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
- Ira R. Forman, Nate Forman. Java Reflection in Action (Manning, 2004)