Reflexió (informàtica)

En informàtica, la reflexió (també anomenada pel seu mot anglès, reflection) és la capacitat d'un programa d'examinar, i eventualment modificar, les seves estructures internes d'alt nivell (per exemple els seus objectes) durant la seva execució.

Introspecció i intercessió

Hom distingeix dues tècniques usades pels sistemes dotats de reflexió:

  • La introspecció, és la capacitat d'un programa d'examinar el seu propi estat.
  • La intercessió, és la capacitat d'un programa de modificar el seu propi estat d'execució o d'alterar la seva pròpia interpretació o significat.

La introspecció és utilitzada per efectuar mesures de rendiment, monitorar els mòduls o depurar un programa. Està implementada en llenguatges com Smalltalk o Java que proveeixen eines per conèixer la classe d'un objecte, els seus atributs, els seus mètodes, etc. La introspecció no existeix en llenguatges com el C o el Pascal.

La intercessió permet a un programa evolucionar automàticament en funció del seu entorn. Aquesta propietat apareix als llenguatges com Smalltalk o Python, però no la trobarem en llenguatges com Java.

Reflexió estructural i reflexió comportamental

Paral·lelament al concepte d'introspecció i d'intercessió, hi ha dos tipus de reflexió: la reflexió estructural i la reflexió comportamental.

La reflexió estructural consisteix a reïficar el codi d'un programa i tots els tipus abstracte accessibles per aquest programa. Al primer cas, la reïficació del codi d'un programa permet de manipular aquest programa durant l'execució. És possible així de mantenir un programa al mateix temps que aquest executa les seves tasques. Al segon cas, la reïficació dels tipus abstractes permet al programa d'examinar i de modificar l'estructura de tipus complexos. Es pot així, per exemple, posar a punt algorismes genèrics de serialització.

La reflexió comportamental (o reflexió de comportament) concerneix més particularment l'execució del programa i el seu entorn. Per aquest tipus de reflexió, un programa té mitjans per saber com s'interpreta i té la possibilitat de modificar la seva manera de ser executat, intervenint sobre les estructures de dades de l'avaluador del programa i sobre l'avaluador en si mateix. Així, el programa pot obtenir informacions sobre la seva implementació o fins i tot s'autoreorganitza amb el propòsit d'adaptar-se millor al seu «entorn».

Reflexió i programació orientada a objectes

En programació orientada a objectes, l'arquitectura reflexiva està implementada pel concepte dels metaobjectes. Aquests representen elements dels programes orientats a objectes com les classes, els missatges i les funcions genèriques. La manipulació d'aquests metaobjectes es fa per un protocol de metaobjectes que permet de decidir els comportaments del llenguatge. CLOS ha estat el primer llenguatge a tenir implementat un protocol de metaobjectes.

Llenguatge reflexiu

Els llenguatges següents suporten la reflexió:

Entre els llenguatges on no hi ha distinció entre la compilació i l'execució (Lisp per exemple), no hi ha diferència entre la interpretació del codi i la reflexió.

Exemple

L'exemple següent està escrit en Java :

// Sense usar la reflexió
Foo foo = new Foo();
foo.hello();
// Usant la reflexió
Class cl = Class.forName("Foo");
Method method = cl.getMethod("hello", null);
method.invoke(cl.newInstance(), null);

Els dos trossos de codi creen una instància de la classe Foo i criden el seu mètode hello.

Al primer programa, el nom de les classes i els mètodes està codificat en cru, no es pot usar el nom d'una altra classe. Al segon programa, en canvi, el nom de les classes i mètodes pot variar durant l'execució.

Bibliografia

  • D. G. Bobrow, R. G. Gabriel, i J. L. White. Object oriented programming: the CLOS perpective. MIT Press, 1993. (anglès)
  • G. Kickzales, J. des Rivières, i D. G. Bobrow. The art of the metaobject protocol. MIT Press, 1991. (anglès)

Vegeu també