Anwendungen von Reflection



  • Welche sinnvollen Anwendungen von Reflection gibt es? Mir fällt momentan nur Persistenz ein...

    Und welche Aspekte sollten durch Reflection abgedeckt sein, damit es sinnvoll einsetzbar ist?
    - Properties (bzw. Get- und Set-Methoden)
    - Member-Variablen
    - Adressen von Methoden (in C++ könnte man sie wegen der Bescränkungen der Methodenzeiger dann ohne Kenntnis des Typs nicht aufrufen)
    - Aufruf von Methoden (dann kommt man nicht an die Adresse)
    - Basisklassen
    - Konstruktoren und Destruktoren
    - ...?



  • audacia schrieb:

    Welche sinnvollen Anwendungen von Reflection gibt es? Mir fällt momentan nur Persistenz ein...

    Höhere Abstraktion, dynamischere Funktionalität.

    Zum Beispiel Multimethods für Java: Practical Common Lisp (oder besser einfach mal Google: java reflection multimethods, da findet sich bestimmt was).



  • Löst man Multimethoden nicht eher auf effizienteren Wegen?

    Und gibt es sonst noch praktische Anwendungsfälle?



  • Es gibt natürlich bei weitem mehr Anwendungsgebiete, ich würde fast meinen beliebig viele, gerade im Bezug auf Metadaten wie Annotations in Java oder Attribute in C#. Aspektorientierte Programmierung ist z.B. ein klassisches Beispiel in dem beides verwendet wird, siehe z.B. Spring AOP oder in vereinfachter Form auch EJB Interceptoren. Ein weiteres typisches Beispiel ist Transaktionsmanagement, was ja eine typischer Querschnittsaufgabe ist (auch hier verweise ich wieder auf AOP). ....



  • Hab auch schon mal eine Implementierung des Factory-Patterns mittels Reflection gesehen. Das coole daran ist, dass sich die betreffenden Objekte automatisch in der Factory registrieren und die Factory dann automatisch das gewünschte Objekt zurückgibt. Ohne das man da irgendwie selbst Hand anlegen müsste.



  • Ein tolles Anwendungsbeispiel von Reflection ist noch das ActiveRecord Pattern von RoR (also Persistenz).
    Oder auch schön: Du lädst ne CSV-Datei in ein Objekt, und hast dann Variablen die genauso heißen wie deine Spalten.
    Auch schön sind Codeattribute (<blub> in .NET, @Attribute in Java) - wo wären wir ohne sie?



  • sachen wie active-record sind einfach nur reflection basierte ORM's



  • Headhunter schrieb:

    Oder auch schön: Du lädst ne CSV-Datei in ein Objekt, und hast dann Variablen die genauso heißen wie deine Spalten.

    Nicht nur CSV-Dateien lassen sich damit schön parsen, auch z.B. XML-Dateien. Commons Digester zeigt es vor.

    Digester digester = new Digester(/* ... */);
    digester.addObjectCreate("config/service", ServiceBean.class);
    digester.addBeanPropertySetter("config/service/name");
    digester.addBeanPropertySetter("config/service/port");
    digester.addBeanPropertySetter("config/service/authorization-required", "authorizationRequired");
    digester.addSetNext("config/service", "addService", ServiceBean.class.getName());
    
    digester.push(serviceCollection);
    digester.parse(inputStream);
    


  • Danke für die aktive Beteiligung 😉

    Das Parsen von Dateien jeglicher Art, die in irgendeiner Art ein Objekt abbilden, meinte ich mit "Persistenz". Die anderen waren mir noch nicht bekannt.

    Falls ihr noch mehr habt, ich bin interessiert 🙂



  • Naja, überall wo man mit Objekten hantiert, dessen Eigenschaften man zur Compile-Zeit nicht kennt. Ich könnte mir vorstellen, das man damit zB ziemlich praktischen GUI-Code schreiben kann, der sich eben zur Laufzeit über Objekte legen kann.

    <lisper arroganz>
    Aber Reflections sind ja nur ein billiger Notbehelf für Leute die kein voll programmierbares MOP haben :p
    </lister arroganz>



  • rüdiger schrieb:

    Ich könnte mir vorstellen, das man damit zB ziemlich praktischen GUI-Code schreiben kann, der sich eben zur Laufzeit über Objekte legen kann.

    Ja; z.B. die VCL macht das so.

    rüdiger schrieb:

    <lisper arroganz>
    Aber Reflections sind ja nur ein billiger Notbehelf für Leute die kein voll programmierbares MOP haben :p
    </lister arroganz>

    (Marketing||Message||Meta||Methaphor||Monitoring)-oriented Programming? Metaobject Protocol? In welcher Sprache hat man das denn (solange man keinen speziellen Präprozessor verwendet)?



  • MOP := Metaobject Protocol

    Common Lisp hat zB ein voll programmierbaren MOP. Bei anderen Programmiersprachen bin ich mir nicht so sicher. Aber ich glaube Objective C oder Smalltalk könnten so etwas auch bieten



  • gibts irgendwo eine definition was ein voll programmierbares mop leisten muss, um als solches zu gelten



  • Hallo

    rüdiger schrieb:

    ich glaube Objective C oder Smalltalk könnten so etwas auch bieten

    Mit Smalltalk wurde Metaprogrammierung sozusagen erfunden.
    Dort ist alles ein Objekt, natürlich auch Klassen, die nämlich Instanzen von
    Metaklassen sind (in Python ähnlich, aber nicht so weitreichend introspektiv).

    Da die gesamte Sprache (bis auf einige Primitives) einschließlich Interpreter und VM in Smalltalk selbst definiert und damit Smalltalk praktisch sein eigenes Metasystem ist, kann man nahezu sämtliche Aspekte des Objektmodells ändern, ohne die hochsprachliche Ebene verlassen zu müssen.

    Gruß


Anmelden zum Antworten