reflective programming (tsz. reflective programmings)
A reflektív programozás olyan technika, amely lehetővé teszi a program számára, hogy:
A reflektivitásnak két alapvető fajtája van:
A reflektív programozás ötlete már a Smalltalk nyelvben is megjelent az 1980-as években, ahol az objektumok és osztályok is objektumként kezelhetők. Később a Java, Python, C# és más nyelvek is implementálták a reflektív képességeket, különböző mértékben.
A reflektív programozás során a program egy meta-szintű leírást hoz létre saját magáról. Ezt a leírást használja fel introspekcióra vagy intervencióra.
Például Java nyelvben így kérdezhetjük le egy objektum osztályának metódusait:
Class<?> clazz = obj.getClass();
Method methods = clazz.getDeclaredMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
Itt a getClass()
és a getDeclaredMethods()
reflektív hívások, amelyek futásidőben derítik ki a típust és a metódusokat.
Reflektív technikákkal automatikusan felfedezhetjük az osztályokat, metódusokat és mezőket, ami lehetővé teszi:
Például JSON vagy XML formátumba való átalakításkor a reflektív rendszer felismeri az osztály mezőit, és azok értékeit exportálja/adja vissza.
A keretrendszerek (pl. Spring Java-ban) reflektív módon hozzák létre és konfigurálják az objektumokat, például konstruktorhívás és setter metódusok segítségével.
A program képes új modult betölteni futásidőben, és azt azonnal integrálni a működésbe, például játékmodulok vagy szolgáltatások hozzáadásával.
A java.lang.reflect
csomag biztosítja az osztályok, mezők, metódusok és konstruktorok lekérdezését és módosítását.
A getattr()
, setattr()
, hasattr()
függvények, valamint a __dict__
és type()
használhatók introspekcióra és intervencióra.
class Example:
def greet(self):
print("Hello!")
obj = Example()
method = getattr(obj, 'greet')
method()
A .NET keretrendszer System.Reflection
nevű névtere biztosítja a reflektív képességeket.
Method m = obj.getClass().getMethod("sayHello");
m.invoke(obj);
setattr(obj, 'new_attr', 42)
print(obj.new_attr)
A reflektív rendszerek gyakran metaobjektum-protokollt (MOP) használnak. Ez egy szabályrendszer, amely meghatározza, hogyan vizsgálható és manipulálható a program szerkezete. Az MOP-t támogató nyelvek például a Lisp és a Smalltalk.
A reflektív programozás egyik megközelítése a tükörmodell, amely elkülöníti a program működését és a reflektív meta-adatokat egy külön tükörosztályban vagy komponensben. Ez jobb biztonságot és tisztább architektúrát eredményez.
A reflektív programozás nagyfokú rugalmasságot kínál, különösen olyan rendszerekben, ahol dinamikusan kell reagálni vagy alkalmazkodni. Ugyanakkor fokozott odafigyelést igényel a teljesítmény és a biztonság terén. Megfelelően alkalmazva hatékony eszköze lehet a modern, moduláris, plug-in alapú vagy tesztelhető rendszereknek.