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 .
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 .
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”.
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.
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.
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.