Metaprogrammierung, Introspection, Reflection Metaprogramming, Introspection, Reflection was ist das? und was bringt‘s? (leider 86 Folien!) Markus Völter Metaprogrammierung, Introspection, Reflection [email protected] copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Warum Metalevel? Zusätzliche Ebene in Softwaresystemen Programmiersprachen Systemarchitekturen Daher mehr Flexibilität Cross-Cutting concerns können damit abgehandelt werden. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Repräsentation von Programmen Programme können in verschiedenen Repräsentationen vorliegen: Als Quellcode, interpretiert Als Zwischencode (P-Code) In Maschinensprache Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Tower II Daten Layer 0 repräsentiert mittels Daten von repräsentiert mittels Daten von führt aus Programm Layer 1 führt aus Layer 2 Layer n-1 repräsentiert mittels Daten von Metaprogrammierung, Introspection, Reflection führt aus Layer n copyright © 2001, MATHEMA AG Metaprogramm Metaprogrammierung, Introspection, Reflection 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. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Zugriff auf die Metaschichten Programm muss auf das Metaprogramm zugreifen können Lesend Schreibend Semantik-Ändernd Die entsprechende Schnittstelle wird als Metaobjekt Protokoll (MOP) bezeichnet Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection N ACHTUNG N Ja, damit kann man richtig viel kaputt machen !!! Ist nur was für richtige Programmierer Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Beispiel OO Objekt Objekte sind Instanzen von Klassen <<instanceof>> Klasse Klassen sind Instanzen von Metaklassen <<instanceof>> Insofern sind Klassen auch Objekte Metaprogrammierung, Introspection, Reflection Metaklasse copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung in MetaJava Test.java 01 class Test extends Object metaclass StdMetaclass { 02 public void doSomething() { 03 // do something 04 } 05 } Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung in MetaJava LoggingMetaClass.java 01 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 } Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung in MetaJava LogTest.java 01 public class LogTest extends Object metaclass LoggingClass { 02 public void doSomething() { 03 // do something 04 } 05 } Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung in MetaJava Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung in MetaJava Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung MetaJava: Anwendungen Logging Pre-/Postconditions Remoting Singletons, Pooling von Instanzen, ... Uvam... Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflection in EchtJava Die Klasse eines Objektes kann erfragt werden: Class carClass = aCar.getClass(); Von dieser Klasse kann dann zum Beispiel die Superklasse erfahren werden: Class parent = carClass.getSuperclass(); ... oder aber die von der Klassen implementierten Interfaces: Class[] ifs = carClass.getInterfaces(); Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflection in EchtJava (II) Von einer Klasse können dann die Attribute aufgelistet werden: Field[] fields = carClass.getFields(); Field field = carClass.getField( „speed“ ); ... Und natürlich die Methoden: Method[] allMethods = carClass.getMethods(); Method[] someMeth = carClass.getMethods( „accelerate“, {Integer.class} ); Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 ) } ); Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflection in EchtJava (IV) Man kann auch neue Objekte erzeugen: Car someNewCar = (Car)carClass.newInstance(); Auch eine Klasse kann dynamisch geladen und instanziiert werden: String className = // construct name somehow AbstractSuperclass inst = (AbstractSuperclass) Class.forName( className ).newInstance(); Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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... Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Ein bischen Ein bischen Metaprogrammierung in Java: Proxy API GoF Proxy Proxy API kann zur Laufzeit für eine beliebige Klassen Objektproxies erzeugen Methodenaufrufe werden abgefangen und an weitergeleitet an InvocationHandler Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Ein bischen Ein bischen Metaprogrammierung in Java: Proxy API Beispiel: Constraints Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Ein bischen Ein bischen Metaprogrammierung in Java: Proxy API Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Ein bischen Ein bischen Metaprogrammierung in Java: Proxy API Der InvocationHandler Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Ein bischen Ein bischen Metaprogrammierung in Java: Proxy 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 ) ); } } Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 M0: Instanzen Objekte, Instanzen zur Laufzeit M1: Modell konkretes Klassenmodell in UML M2: Metamodell z.B. UML M3: Meta-Metamodell MOF Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Das OMG Metamodell Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Das OMG Meta modell Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection DIY-MP: Decorator Es kann transparent zu einem Objekt neue Funktionalität hinzugefügt werden, z.B. pre/post operations Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection DIY-MP: Decorator Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection DIY-MP: Proxy Proxies können Methodenaufrufe „abfangen“ und deren Semantik verändern Beispiel: Remote Proxy Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection DIY-MP: Factory Factories abstrahieren den Erstellungsprozess von Objektes Damit können z.B. Proxies, Singletons oder Decorators erstellt werden Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues (POSA-Reflection) Eigene Klassen für Klassen Methoden Attribute Typen Man kann damit leicht das Verhalten des Programms modifizieren, da jetzt die Programmstrukturen als Daten der Programmiersprache vorliegen ... Ja, damit wird das Programm etwas langsamer (TANSTAAFL) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues (Brian Foote) Reflective metalevel architectures should be designed with message passing at the bottom, self-representations, extensibility, abstract inheritance, first-class representation, abstract dispatching, and abstract scope. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues (Brian Foote) II All significant elements of a languages' programming model ought to be themselves reflected in firstclass elements of that language's metalevel architecture. For instance, if the programming model makes extensive use of a notion like "class", then class objects should be explicit, first-class elements of the metaarchitecture that coexist with ordinary application objects at runtime. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues (Brian Foote) III Hence, a framework for object-oriented reflective metalevel architectures might draw from a rich palette of potential metaobjects, including variables, selectors, messages, interpreters, Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG handles, message queues, stores, closures, classes and types prototypes, methods and signatures, code, threads, and instances... Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD Anforderung an einen Ressource Access Irgendwelche Personen oder Gruppen... ... sollen irgendwelche Resourcen ... irgendwie verwenden dürfen Die beteiligten Entitäten und Aktionen stehen fest Organisation, Team, Person Raum, Beamer Verwenden, Belegen Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD (II) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD (III) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD (IV) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD (V) Weitere Anforderungen Es müssen neue Resourcentypen leicht hinzufügbar sein Es müssen die Regeln für die Benutzung definierbar sein Die Organisationsstrukturen müssen flexibel veränderbar sein, auch zur Laufzeit Dann wird‘s interessant ! Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Party::canBeAdded( p: Party ) { return type. canBeAdded(this,p); } Reflective Architectues: Beispiel RAD (VI) Typ kann zur Laufzeit geändert werden Es können leicht neue Typen dazugebaut werden (Prototype) Type Objects sind oft Singletons Person::canBeAdded( parent: Party; newChild: Party ) { return false; } Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD (VII) Knowledge Level kann Constraints enthalten KL: Definiert die Entitäten für den NL („Programm“) NL: Enthält die wirklichen Arbeitsdaten Permission::Permission( p : Party; r : Resource; a : Action ) throws ... { if ( !r.getType().isActionPossible( a ) ) throw ... // assign attributes } Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Architectues: Beispiel RAD (VIII) Knowledge Level kann selbst wieder dynamisch konfigurierbar sein Regeln können in High-Level Sprache definiert werden usw. usf. Mehr derartiges: Martin Fowler‘s Analysis Patterns Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metaprogrammierung und Komponenten Komponentenarchitekturen verfügen auch über explizite Informationen über Typen und Instanzen. Einige Patterns werden verwendet: Komponentenproxy, Factory, Interception Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection MP und Komponenten: Komponentenproxy Anwendung des Proxymusters um Aufrufe an physikalische Instanzen weiterzuleiten Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection MP und Komponenten: Component Home Anwendung des Factory-Musters um Instanzen von (entfernten) Komponenten zu erzeugen Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection MP und Komponenten: RYO-Interception Erlaubt es, beliebigen Instanzen durch konfigurierbare Interceptoren „technische“ Funktionalität hinzuzufügen. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection MP und Komponenten: RYO-Interception Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection 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 Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Dirk Riehle‘s UML Virtual Machine Zweck: Ausführung von UML Diagrammen durch Interpretation Aufbau des Systems: Metalevel-Architektur, die die Schichten der UML in Software abbildet. Interessant daran vor allem, der Zusammenhang zwischen Modellierung und Laufzeit. Infos unter: http://www.riehle.org/papers/2001/oopsla-2001.pdf Unbedingt lesen Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Dirk Riehle‘s UML Virtual Machine (II) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Dirk Riehle‘s UML Virtual Machine (III) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Dirk Riehle‘s UML Virtual Machine (IV) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Middleware Reflective Middleware macht von den Prinzipien der Metaprogrammierung im Umfeld von verteilten Sytemen, vor allem CORBA Gebrauch. Damit werden vor allem Qualitiy of Service Aspekte implementiert, z.B. Dynamische Neukonfigurierung, z.B. nach Ausfall eines Teils des Systems Überwachen und Anpassen von Bandbreiten, Durchsatz, etc., ggfs. auch Anpassung URLs: www.computer.org/dsonline/0105/features/rom0105_1.htm devius.cs.uiuc.edu/2k/dynamicTAO/ www.comp.lancs.ac.uk/computing/rm2000/ Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflective Middleware (II): Beispiel Quality Objects, Produkt von BBN Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Reflection in RDBMS Das Schema einer relationalen Datenbank ist üblicherweise auch mittels Tabellen beschrieben. Introspection ist mit normalem SQL möglich Beispiel Oracle: SELECT * FROM TAB liefert mir Informationen über die Tabellen im aktuellen Schema Ändern der Daten ist mittels speziellen SQL- Statements möglich Also statt INSERT INTO TAB... wird CREATE TABLE... Verwendet. Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Metalevel-Struktur in relationalen DB Es kann ein vertikales Schema verwendet werden. PK-Col Name Value PK-Col Col1 Col2 Col3 Col4 PK1 Col1 Val1_1 PK1 Val1_1 Val1_2 Val1_3 Val1_4 PK1 Col2 Val1_2 PK2 Val2_1 Val2_2 ... Val2_3 Val2_4 PK1 Col3 Val1_3 PK1 Col4 Val1_4 Valn_2 Valn_3 PK2 Col1 Val2_1 PK2 Col2 Val2_2 PK2 Col3 Val2_3 PK2 Col4 ... Val2_4 PKn Col1 Valn_1 PKn Col2 Valn_2 PKn Col3 Valn_3 PKn Col4 Valn_4 PKn Valn_1 Valn_4 Die Feldnamen (Col1..n) können in Meta-Tabelle definiert sein. Vorteil: Flexibel Nachteil: Performance, Abfragen werden ggfs. trickreich Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Und AOP? AOP ist sowas ähnliches Ist historisch aus Metaprogrammierung entstanden, z.T. gleiche Leute Kann als statische Metaprogrammierung verstanden werden; nicht so mächtig, aber einfacher Aber das ist ein anderer Vortrag! Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Resourcen Brian Foote‘s Material zum Thema Reflection: http://www.laputan.org/foote/papers.html#Reflection Einige Definitionen http://www.iutc3.unicaen.fr/ ~stincs/research/reflection/ OpenC++, OpenJava http://www.csg.is.titech.ac.jp/~chiba/openc++.html Reflection 2001, Conference Page http://www.openjit.org/reflection2001/ Kiczales et. al., The Art of the Metaobject Protocol MIT Press, ISBN 0-262-61074-4 Martin Fowler, Analysis Patterns, Reusable Object Models; Addison Wesley (`?) Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG Metaprogrammierung, Introspection, Reflection Ende, das wars! Fragen, Kritik, Anregungen? Oder Fragen, Kritik, Anregungen bezüglich wie Fragen, Kritik oder Anregungen aufgenommen werden sollen? Oder Fragen, Kritik, Anregungen bezüglich wie Fragen Fragen, Kritik, Anregungen bezüglich wie Fragen, Kritik oder Anregungen Anregungen bezüglich wie Fragen, Kritik oder Anregungen aufgenommen werden sollen? Metaprogrammierung, Introspection, Reflection copyright © 2001, MATHEMA AG