1 / 86

Abstract

Metaprogramming, Introspection, Reflection was ist das? und was bringt‘s? (leider 86 Folien!) Markus Völter markus.voelter@mathema.de. Abstract.

meara
Download Presentation

Abstract

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Metaprogramming, Introspection, Reflectionwas ist das?und was bringt‘s?(leider 86 Folien!)Markus Völter markus.voelter@mathema.de

  2. Abstract Metaprogrammierung und Metalevel-Architekturen gelten gemeinhin als relativ schwieriges, jedoch auch sehr mächtiges Paradigma. Allerdings können sich die wenigsten Programmierer unter den Begriffen konkret etwas vorstellen. Dieser Vortrag soll einige der relevanten Konzepte einführen und auch konkret aufzeigen, wo derartige Mechanismen sinnvoll verwendet werden, oder werden könnten.

  3. Warum Metalevel? • Zusätzliche Ebene in Softwaresystemen • Programmiersprachen • Systemarchitekturen • Daher mehr Flexibilität • Cross-Cutting concerns können damit abgehandelt werden.

  4. Reflection Hypothesis by Smith, 1982 In as much as a computational process can be constructed to reason about an external world in virtue of comprising an ingredient process (interpreter) formally manipulating representations of that world, so, too, a computational process could be made to reason about itself in virtue of comprising an ingredient process (interpreter) formally manipulating representations of ist own operations and structures. Smith, The Reflection Hypothesis

  5. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  6. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  7. Programme und Daten • Programme sind ausführbare Befehle, Sequenzen, Anweisungen • Daten sind die Informationen, mit denen ein Programm arbeitet • Ein Programm kennt seine Daten – es kennt sich aber selber nicht.

  8. Repräsentation von Programmen • Programme können in verschiedenen Repräsentationen vorliegen: • Als Quellcode, interpretiert • Als Zwischencode (P-Code) • In Maschinensprache

  9. Voraussetzungen für Metaprogrammierung • Das Programm hat in irgendeiner Art und Weise Zugriff auf sich selber • Üblicherweise liegt das Programm in derselben Repräsentation vor, wie die Daten des Programms. • Metaprogramming: Programs as data

  10. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  11. Reflective Tower • Wenn das Programm A als Daten vorliegt, wird ein Programm B benötigt, welches das Programm A ausführt: das Metaprogramm • Auch dieses Programm kann wieder mittels eines Metaprogramms ausgeführt werden... usw. usw. • Üblicherweise sind diese Metaprogramme alle in derselben Sprache/Struktur repräsentiert

  12. Reflective Tower II

  13. Causal Connection Zusammenhang zwischen den einzelnen Schichten muss dem folgenden Prinzip gehorchen:A level is causally connected with the next higher (meta-) level, if the lower level conforms to the higher level and if changes in the higher level lead to according, well-defined changes in the lower level.

  14. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  15. Zugriff auf die Metaschichten • Programm muss auf das Metaprogramm zugreifen können • Lesend • Schreibend • Semantik-Ändernd • Die entsprechende Schnittstelle wird als MetaobjektProtokoll (MOP) bezeichnet

  16. Introspection: Lesender Zugriff • Ein Programm hat lesenden Zugriff auf sich selbst: • Typinformationen • Informationen über Klassen, deren Attribute, und Operationen • Vererbungshierarchie • Dyn. Aufruf von Methoden oder Instantiierung von Klassen • Beispiel: Java

  17. Reflection: Schreibender Zugriff • Ein Programm hat schreibenden Zugriff auf sich selbst: • Ändern der Klassendefinition durch • hinzufügen, • löschen, • überschreiben von Operationen • Ändern der Klassenhierarchie durch Einfügung von Basisklassen, etc. • Beispiel: CLOS, Smalltalk

  18. Reification: Modifikation des Verhaltens • Das Verhalten des Programms kann (ggfs. zur Laufzeit) modifiziert werden, z.B. durch Änderung der Semantik von • Instantiierungen, • Methodenaufrufen, • Attributzugriffen, • etc. • Das funktioniert üblicherweise durch Reflection bzgl. des Metaprogramms • Beispiel: CLOS

  19. N ACHTUNG N Ja, damit kann man richtig viel kaputt machen !!! Ist nur was für richtige Programmierer 

  20. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  21. Beispiel OO • Objekte sind Instanzen von Klassen • Klassen sind Instanzen von Metaklassen • Insofern sind Klassen auch Objekte

  22. Beispiel OO: Sprachen • CLOS: Reification, Reflection, Introspection • MOP, Lisp in Lisp • Smalltalk: Reflection • Dictionary Objekte, (Smalltalk := nil)... • Java: Introspection, teilweise Reflection • java.lang.Class, java.reflect • Self: Reification, Reflection, Introspection • Generell findet man diese Features eher in (pseudo-) interpetierten Sprachen

  23. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  24. Metaprogrammierung in MetaJava1 • Anforderungen: In einem Java Programm soll jeder Methodenaufruf geloggt werden. • Dies soll geschehen ohne dass der Quellcode in jeder Methode modifiziert werden muss. • Beispielimplementierung in „MetaJava“, um CLOS Syntax zu vermeiden 1) MetaJava: Hypothetisches Java mit Metaobjektprotokoll um CLOS Syntax zu vermeiden

  25. Metaprogrammierung in MetaJava Test.java01 class Test extends Object metaclass StdMetaclass { 02 public void doSomething() { 03 // do something 04 } 05 }

  26. Metaprogrammierung in MetaJava LoggingMetaClass.java01 public class LoggingClass extends StdMetaclass { 02 public void invokeMethod( Object dest, String name, Object[] params ) { 03 System.out.println( name+" called on "+ dest+" with "+params ); 04 super.invokeMethod( dest, name, params ); 05 } 06 }

  27. Metaprogrammierung in MetaJava LogTest.java01 public class LogTest extends Object metaclass LoggingClass { 02 public void doSomething() { 03 // do something 04 } 05 }

  28. Metaprogrammierung in MetaJava

  29. Metaprogrammierung in MetaJava

  30. Metaprogrammierung MetaJava: Anwendungen • Logging • Pre-/Postconditions • Remoting • Singletons, Pooling von Instanzen, ... • Uvam...

  31. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  32. Reflection in EchtJava • Die Klasse eines Objektes kann erfragt werden: • Von dieser Klasse kann dann zum Beispiel die Superklasse erfahren werden: • ... oder aber die von der Klassen implementierten Interfaces: Class carClass = aCar.getClass(); Class parent = carClass.getSuperclass(); Class[] ifs = carClass.getInterfaces();

  33. Reflection in EchtJava (II) • Von einer Klasse können dann die Attribute aufgelistet werden: • ... Und natürlich die Methoden: Field[] fields = carClass.getFields(); Field field = carClass.getField( „speed“ ); Method[] allMethods = carClass.getMethods(); Method[] someMeth = carClass.getMethods( „accelerate“, {Integer.class} );

  34. Reflection in EchtJava (III) • Wenn man ein Methodenobjekt hat, kann man die Methode auch aufrufen: Car car = new Car(); car.accelerate( 20 ); Class carClass = car.getClass(); Method accMethod = carClass.getMethod( „accelerate“, {Integer.class} ); accMethod.invoke( car, { new Integer( 20 ) } );

  35. Reflection in EchtJava (IV) • Man kann auch neue Objekte erzeugen: • Auch eine Klasse kann dynamisch geladen und instanziiert werden: Car someNewCar = (Car)carClass.newInstance(); String className = // construct name somehow AbstractSuperclass inst = (AbstractSuperclass)Class.forName( className ).newInstance();

  36. Reflection in EchtJava (V) • Desweiteren können erfragt werden • Modifier von Klassen (public, static, ... ) • Modifier von Methoden (public, snchronized, final) • Modifier von Attributen (public, final) • Ist eine Klasse ein primitive? • Kann man zuweisen? • Das Package und den Name einer Klasse...

  37. Reflection in EchtJava: Anwendungen • JDBC • Treiber laden • JavaBeans • Properties-Anzeige in IDEs • Setzen von Werten in der DIE • EJB (auch CORBA) • ComponentReflection: Heruasfinden der Methoden um dann in GUI Tool Tx oder Security Einstellungen vorzunehmen • ComponentProxy: Aufruf der Methoden auf der Implementierung • ComponentBus: Transport der Aufrufinformationen in generischem Bus

  38. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  39. Ein bischen Metaprogrammierung in Java: Ein bischenProxy API • GoF Proxy • Proxy API kann zur Laufzeit für eine beliebige Klassen Objektproxies erzeugen • Methodenaufrufe werden abgefangen und an weitergeleitet an InvocationHandler

  40. Ein bischen Metaprogrammierung in Java: Ein bischenProxy API • Beispiel: Constraints

  41. Ein bischen Metaprogrammierung in Java: Ein bischenProxy API

  42. Ein bischen Metaprogrammierung in Java: Ein bischenProxy API • Der InvocationHandler

  43. Ein bischen Metaprogrammierung in Java: Ein bischenProxy API • Erstellen der Proxies public class ObjectFactory { public static Proxy createProxy(Object o) { Class c = o.getClass(); return Proxy.newProxyInstance( o.getClass().getClassLoader(), o.getClass().getInterfaces(), new PPCInvocationHandler( o ) ); } }

  44. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  45. Das OMG Metamodell • Die OMG setzt ein Metamodell ein, um z.B. die UML formal zu definieren • OMG Metamodell: MOF, Meta Object Facility • XML-Repräsentation: XMI

  46. Das OMG Metamodell

  47. Das OMG Metamodell • MOF enthält Repräsentationen für • Klassen, Interfaces, Typen • Attribute, Operationen • Assoziationen, Generalisierungen • etc. • Mittels der MOF kann die Semantik der damit definierten Modelle formal beschrieben werden. • Die MOF ist mittels UML notiert. • MOF/XMI dient auch als Austauschformat für konkrete Modelle, die mit einer auf der MOF basierenden Notation erstellt werden • Die UML • wurde zunächst „frei Hand“ definiert • Erst später wurde die MOF eingeführt, und UML auf Basis der MOF formal festgelegt

  48. Das OMG Metamodell

  49. Inhaltsverzeichnis • Programme & Daten • Reflective Tower • Introspection, Reflection, Reification: Begriffsdefinitionen • Metaprogrammierung im OO Bereich • Metaprogrammierung in MetaJava • Reflection in Java • Metaprogrammierung in Java: Proxy API • UML Beispiel • Metaprogramming selbst gebaut: Einige Design Patterns • Reflective Architectures (POSA, Foote) • Beispiel für Reflective Architectures • Metaprogrammierung und Komponenten • Weitere Anwendungsbeispiele

  50. Metaprogrammierung selbst gebaut • Nicht alle Sprachen bieten Meta-Features • C++ • Java (naja, ein bischen) • Ada • Fortran • Eiffel • d.h. eigentlich alle kompilierten Sprachen • Man kann sich aber einiges selbst bauen: Patterns

More Related