Reflecție (informatică)

În programarea computerizată , reflecția este capacitatea unui program de a examina și, eventual, de a modifica propriile structuri interne de nivel înalt pe măsură ce se execută .

Numim reflexivitate pentru un limbaj de programare pentru a permite scrierea unor astfel de programe. Se spune că un astfel de limbaj de programare este reflectiv .

Introspecție și mijlocire

Există două tehnici utilizate de sistemele reflectorizante:

Introspecția este utilizat pentru a efectua măsuri de performanță, de control module sau depana un program. Este implementat în limbi precum Smalltalk sau Java care oferă instrumente pentru a cunoaște clasa unui obiect, atributele sale , metodele sale etc. Introspecția nu există în limbi precum C sau Pascal (dar există în Delphi de la versiunea 2010).

Mijlocirea permite unui program să se schimbe în mod automat în funcție de nevoile și mediul înconjurător. Această proprietate apare în limbi precum Smalltalk , Groovy sau Python , dar nu există în limbi precum C.

Reflecția, introspecția și mijlocirea sunt cazuri speciale de metaprogramare .

Gândirea structurală și gândirea comportamentală

Împreună cu conceptele de introspecție și mijlocire, există două tipuri de reflecție: reflecția structurală (care se referă în principal la codul programului) și reflecția comportamentală (care se referă în principal la mediul programului).

Reflecție structurală este de a concretiza codul unui program și toate tipurile abstracte disponibile prin intermediul programului. În primul caz, reificarea codului unui program face posibilă gestionarea acestui program în timpul execuției. Astfel, este posibil să mențineți un program chiar și atunci când acesta efectuează sarcini. În al doilea caz, reificarea tipurilor abstracte permite programului să examineze și să modifice structura tipurilor complexe. Astfel, este posibil, de exemplu, să se dezvolte algoritmi de serializare generici .

Reflecție comportamentală (sau comportamentul de reflexie) se referă în special , la punerea în aplicare a programului și a mediului de program. Prin acest tip de reflecție, un program poate „ști” cum este interpretat și poate modifica astfel modul în care este executat, prin intervenția asupra structurilor de date ale evaluatorului de program și asupra evaluatorului însuși. De fapt, programul poate obține informații despre implementarea acestuia sau chiar se poate reorganiza pentru a se adapta cel mai bine la un „mediu”.

Gândirea și programarea obiectelor

În programarea orientată pe obiecte , arhitectura reflectivă este implementată de conceptul de metaobiecte . Acestea reprezintă elemente ale programelor orientate obiect, cum ar fi clase, mesaje și funcții generice. Manipularea acestor metaobiecte se face printr-un protocol metaobiect care face posibilă decizia asupra comportamentului limbajului. CLOS este primul limbaj care a implementat un protocol meta-obiect.

Limbi reflectante

Următoarele limbi reflectă:

În limbile interpretate sau compilate din mers înainte de execuție ( Lisp de exemplu), nu există nicio diferență între interpretarea codului și reflectare, deoarece acesta este codul sursă care evoluează și nu numai codul rezultat al compilației.

Exemplu

Următorul exemplu este scris în Java  :

// Sans utiliser la réflexion Foo foo = new Foo(); foo.hello(); // En utilisant la réflexion Class<?> cl = Class.forName("package.name.Foo"); // Instanciation de l'objet dont la méthode est à appeler Object instance = cl.newInstance(); // Invocation de la méthode via réflexion Method method = cl.getClass().getDeclaredMethod("hello", new Class<?>[0]); method.invoke(instance);

Următorul exemplu este scris în C #  :

// Sans utiliser la réflexion Foo foo = new Foo(); foo.hello(); // En utilisant la réflexion Type type = typeof(Foo); // Instanciation de l'objet dont la méthode est à appeler // Il existe deux façons d'instancier un objet via la réflexion : // 1, soit : ConstructorInfo constructor = type.GetConstructor(Type.EmptyTypes); object instance = constructor.Invoke(new object[]{}); // 2, soit : instance = Activator.CreateInstance(type); // Invocation de la méthode via réflexion MethodInfo method = type.GetMethod("hello"); method.Invoke(instance, new object[]{});

Cele două bucăți de cod creează o instanță din clasa Foo și apelează la metoda lor salut .

În primul program, numele claselor și metodelor sunt codate greu, nu este posibil să se utilizeze numele altei clase. Cu toate acestea, în al doilea program, numele claselor și metodelor pot varia în timpul rulării.

Bibliografie

  • DG Bobrow, RG Gabriel și JL White. Programare orientată pe obiecte: perspectiva CLOS . MIT Press, 1993.
  • G. Kickzales, J. des Rivières și DG Bobrow. Arta protocolului metaobiect . MIT Press, 1991.

Vezi și tu