A számítógép-programozás , visszaverődés az a képesség, a program, hogy vizsgálja meg, és esetleg módosítani, saját magas szintű belső struktúrákat, mint végrehajtja .
A reflexivitást úgy hívjuk, hogy egy programozási nyelv lehetővé teszi az ilyen programok írását. Az ilyen programozási nyelvről azt mondják, hogy reflektív .
A fényvisszaverő rendszerek két technikát alkalmaznak:
Az önellenőrzést teljesítménymérések végrehajtására, modulok ellenőrzésére vagy egy program hibakeresésére használják . Olyan nyelveken valósítják meg, mint a Smalltalk vagy a Java, amelyek eszközöket nyújtanak az objektum osztályának , attribútumainak , módszereinek stb. Az önvizsgálat nem létezik olyan nyelvekben, mint a C vagy a Pascal (de a Delphi- ben a 2010-es verzió óta létezik ).
A közbenjárás lehetővé teszi, hogy a program automatikusan változzon az igényeknek és a környezetnek megfelelően. Ez a tulajdonság olyan nyelveken jelenik meg, mint a Smalltalk , a Groovy vagy a Python , de nem létezik olyan nyelvekben, mint a C.
A reflexió, az önvizsgálat és a közbenjárás a metaprogramozás speciális esetei .
Az önellenőrzés és a közbenjárás fogalmaival együtt kétféle reflexió létezik: strukturális reflexió (amely főleg a programkódot érinti) és a viselkedési reflexió (amely főleg a program környezetét érinti).
A strukturális gondolkodás az, hogy megtestesít a kódot a program és az összes absztrakt típus érhető el a program. Az első esetben a program kódjának újbóli megerősítése lehetővé teszi a program kezelését a végrehajtás során. Így a program akkor is fenntartható, ha feladatokat lát el. A második esetben az absztrakt típusok újrarendezése lehetővé teszi a program számára, hogy megvizsgálja és módosítsa az összetett típusok felépítését. Így lehetséges például általános sorosítási algoritmusok kifejlesztése .
A viselkedési reflexió (vagy reflexiós viselkedés) konkrétabban a program megvalósításához és a program környezetéhez kapcsolódik. Az ilyen típusú reflexió révén a program "tudja", hogyan értelmezik, és így módosíthatja a végrehajtás módját, beavatkozva a programértékelő adatstruktúrájába és magába az értékelőbe. Valójában a program információkat szerezhet a megvalósításáról, vagy akár önmagát is átszervezheti annak érdekében, hogy a legjobban alkalmazkodjon a „környezethez”.
Az objektumorientált programozásban a reflektív architektúrát a metaobjektumok fogalma valósítja meg . Ezek olyan objektum-orientált programok elemeit képviselik, mint például osztályok, üzenetek és általános funkciók. Ezeknek a metaobjektumoknak a kezelését egy metaobjektum-protokoll végzi, amely lehetővé teszi a nyelv viselkedésének eldöntését. A CLOS az első nyelv, amely meta-object protokollt vezetett be.
A következő nyelvek tükröződnek:
A végrehajtás előtt menet közben értelmezett vagy összeállított nyelvekben ( például Lisp ) nincs különbség a kód értelmezése és a reflexió között, mivel a forráskód fejlődik ki, és nem csak az összeállítás eredményeként kapott kód.
A következő példa Java nyelven íródott :
// 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);A következő példát C # -vel írjuk :
// 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[]{});A két kódrész létrehozza a Foo osztály egy példányát, és meghívja a hello módszerüket .
Az első programban az osztályok és a metódusok neve kemény kódolású, más osztály nevét nem lehet használni. A második programban azonban az osztályok és a metódusok futás közben változhatnak.