Kein Folientitel

Werbung
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
Herunterladen