Refleksja (informatyka)

W programowaniu komputerowym , odbicie jest zdolność programu do zbadania i ewentualnie modyfikować swoje struktury wewnętrzne wysokiego poziomu własnego, gdyż wykonuje .

Nazywamy refleksyjność robi dla języka programowania, aby umożliwić pisanie takich programów. Mówi się, że taki język programowania jest refleksyjny .

Introspekcja i wstawiennictwo

Istnieją dwie techniki stosowane przez systemy odblaskowe:

Introspekcja służy do wykonywania środków wydajności, kontroli modułów lub debugowania programu. Jest zaimplementowany w językach takich jak Smalltalk lub Java, które zapewniają narzędzia do poznania klasy obiektu, jego atrybutów , jego metod itp. Introspekcja nie istnieje w językach takich jak C czy Pascal (ale istnieje w Delphi od wersji 2010).

Wstawiennictwo umożliwia program automatycznie zmienia się w zależności od potrzeb i środowiska. Ta właściwość pojawia się w językach takich jak Smalltalk , Groovy czy Python , ale nie istnieje w językach takich jak C.

Refleksja, introspekcja i wstawiennictwo to szczególne przypadki metaprogramowania .

Myślenie strukturalne i myślenie behawioralne

Wraz z koncepcjami introspekcji i wstawiennictwa istnieją dwa rodzaje refleksji: refleksja strukturalna (która dotyczy głównie kodu programu) i refleksja behawioralna (która dotyczy głównie środowiska programu).

Odbicie strukturalny jest zreifikować kod programu i wszystkie abstrakcyjne typy dostępne w ramach programu. W pierwszym przypadku reifikacja kodu programu umożliwia obsługę tego programu podczas wykonywania. Dzięki temu możliwe jest utrzymanie programu nawet podczas wykonywania zadań. W drugim przypadku reifikacja typów abstrakcyjnych umożliwia programowi badanie i modyfikację struktury typów złożonych. W ten sposób możliwe jest na przykład opracowanie ogólnych algorytmów serializacji .

Odbicie behawioralna (lub zachowanie odbicie) odnosi się w szczególności do realizacji programu i środowiska programu. Dzięki temu rodzajowi refleksji program może „wiedzieć”, jak jest interpretowany, a zatem może modyfikować sposób jego wykonywania, interweniując w struktury danych oceniającego programu i samego oceniającego. W rzeczywistości program może pozyskiwać informacje o jego realizacji, a nawet samodzielnie się reorganizować, aby jak najlepiej dostosować się do „środowiska”.

Myślenie i programowanie obiektowe

W programowaniu obiektowym architektura refleksyjna jest realizowana przez pojęcie metaobiektów . Reprezentują one elementy programów zorientowanych obiektowo, takie jak klasy, komunikaty i funkcje ogólne. Manipulacja tymi metaobiektami odbywa się za pomocą protokołu metaobiektu, który umożliwia decydowanie o zachowaniu języka. CLOS jest pierwszym językiem, w którym zaimplementowano protokół metaobiektowy.

Języki refleksyjne

Następujące języki są refleksyjne:

W językach interpretowanych lub kompilowanych w locie przed wykonaniem (np. Lisp ) nie ma różnicy między interpretacją kodu a odbiciem, ponieważ ewoluuje kod źródłowy, a nie tylko kod wynikowy kompilacji.

Przykład

Poniższy przykład jest napisany w Javie  :

// 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);

Poniższy przykład jest napisany w 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[]{});

Te dwa fragmenty kodu tworzą instancję klasy Foo i wywołują ich metodę hello .

W pierwszym programie nazwy klas i metod są zakodowane na sztywno, nie można użyć nazwy innej klasy. Jednak w drugim programie nazwy klas i metod mogą się różnić w czasie wykonywania.

Bibliografia

  • DG Bobrow, RG Gabriel i JL White. Programowanie obiektowe: perspektywa CLOS . MIT Press, 1993.
  • G. Kickzales, J. des Rivières i DG Bobrow. Sztuka protokołu metaobiektu . MIT Press, 1991.

Zobacz również