Was ist Reflection und wofür ist es gut?



  • Was ist Reflection und wofür ist es gut? 😕



  • Mit Reflection kann man zur Laufzeit auf typinfo zugreifen und sogar veraendern.
    Man kann damit sogar auf Member zugreifen.

    Hier laedt man zum Beispiel Klassenname und Methode zur Laufzeit:

    Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
    // Alternatively: Object foo = Foo.class.newInstance();
    Method m = foo.getClass().getDeclaredMethod("hello", new Class<?>[0]);
    m.invoke(foo);
    

    Manchmal ist es ganz praktisch, wenn man sich dynamisch an unbekannte Typen anpassen will, z.B. fuer Plugins oder beim Debuggen. Allerdings halte ich sehr wenig bis gar nichts von Reflection, weil ich der Ansicht bin, dass man Programminhalt und Programmcode strikt voneinander trennen soll, weil man sonst sehr leicht fehler machen kann, die nur zur Laufzeit und in seltenen Situationen auftreten koennen. Ausserdem ist Reflection durch zusaetzliche Typinfo und Vergleiche sehr langsam.



  • Gibt es Situationen in C++14, wo man Reflection gut gebrauchen könnte? Oder wie kann man es "emulieren"?



  • C++ kann eigentlich kein Reflection. Man kann sich ueber Vererbung, Templates, compiletimepolymorphie, aber eigentlich fuer jeden Fall etwas vernuenftiges selber basteln.
    Das ist auch mit ein Grund, warum ich Reflections ablehne, denn man spart sich damit ein gutes Typsystem und versucht im Gegenteil sein eigenes Typsystem zu umgehen.
    Ich bin jetzt aber auch kein Experte dafuer, weil ich reflection noch nie benutzt habe und auch mit kaum einer Sprache gearbeitet habe, die das ueberhaupt unterstuetzt hat (lua zaehlt nicht).



  • reflection ist nett um an objekten zu manipulieren die keine accessors haben und fuer ihre funktion nicht brauchen. ich hab z.b. fuer ein java projekt einen http server geschrieben der von einer root-node eines graphens alle daten per reflection auflistet, die kannst du dann im browser manipulieren. natuerlich kannst du rekursiv die hierarchy durchgehen. wenn die implementierung einmal funktioniert, geht das mit beliebigen datentypen darunter.
    jede neue klasse bzw deren instanz kann genau so manipuliert bzw beobachtet werden. und alles ohne interfaces zu schreiben, accessors zu implementieren, dinge zu regestrieren usw.

    manche nutzen reflection auch um serialisierung zu implementieren, (website darstellen ist ja nichts anderes eigentlich).

    debugger nutzen serialisierung um dir alle datentypen usw anzuzeigen.

    afaik: Qt simuliert das indem ein pre-prozess laeuft und die noetigen reflection daten generiert.

    hmm, hat c++14 irgendwas neues an RTTI bekommen um das zu bieten?


Log in to reply