Metamodell, Reflection in objektorientierten Sprachen Probevorlesung Friedrich Steimann
Voraussetzungen Grundbegriffe der Objektorientierung Klasse, Beziehung, Subklasse, Verhalten etc. grundlegende Notationselemente der UML Klassendiagramm Grundlegende Programmierkenntnisse in Java
Metamodell, Reflection in objektorientierten Sprachen
Kontext: letzte Vorlesung Durchgängigkeit der Objektorientierung annähernd gleiche Konzepte in Analyse, Design (Modell) und Implementierung Modell Klasse Attribut Beziehung Verhalten Programm Klasse Instanzvariable (Feld) Instanzvariable (Feld) Array, Collection Methode
Modell (Beispiel) Universität Student Modul Teil Dozent belegt bietet an Dozent
Wechsel des Gegenstandsbereichs Notation der Modelle bleibt gleich andere Notation denkbar, ändert nichts an der Bedeutung wie sich auch Notation von Modellierung und Implementierung unterscheiden Sprachkonstrukte der Modellierungssprache vom Gegenstandsbereich unabhängig
Modell (anderes Beispiel) TheaterMaxx Stück Akt Szene Absatz Regieanweisung Text Darsteller besetzt Rolle gehört zu
Wechsel der Ebene Modelle können selbst Gegenstand der Modellierung sein! Programme können selbst Gegenstand der Programmierung sein! Modellierung der Modellierung unter Verwendung derselben Sprachkonstrukte Programmierung der Programmierung unter Verwendung derselben Sprachkonstrukte
Modell der objektorientierten Modellierung (Metamodell) Vererbung Beziehung Klasse Verhalten abstrakte Klasse unendlicher Regress! konkrete Klasse
Modell des Modells der objektorientierten Modellierung Vererbung Metaklasse Beziehung abstrakt/konkret ist ein Attribut der Metaklasse Meta-Metamodell
Modell des Modells des Modells der objektorientierten Modellierung Klasse Beziehung Meta-Meta-Metamodell Entity-Relationship-Modell!
Metaprogramme Programme, die Programme als Ein- und/oder Ausgabe haben Compiler/Interpreter Refactoring-Werkzeuge Programme, die sich selbst als Ein- und/oder Ausgabe haben (Reflektion) „selbstbewußter“ Code selbstmodifizierender Code Voraussetzung: Programme müssen sich selbst als Daten lesen können! Metaprogrammierung
Stufen der Metaprogrammierung Typ-Introspektion C++ mit RTTI allgemeine Introspektion Java (häufig Reflektion genannt) Interzession oder Interzeption Lisp MOP, AspectJ (volle) Reflektion Maschinencode (!), Lisp, Prolog, Smalltalk Schon Alan Turing hatte einen Streit mit John von Neumann, ob man für die bedingte Verzweigung eine eigene Anweisung bräuchte – Turing wollte das Sprungziel berechnen! Im Maschinencode liegen Programme und Daten trivialerweise immer in derselben Form vor. Trennung war eigentlich zunächst ein Gewinn!
Javas Reflection-API Klasse Beschreibung Object Methode getClass() Class Instanzen repräsentieren Klassen und Interfaces Constructor Aufruf von Konstruktoren variablen Typs Field Information über und Zugriff auf Felder variabler Typen Method Information über und Aufruf von Methoden variabler Typen Modifier Information über Access Modifier von Typen und deren Membern Array Erzeugung von und Zugriff auf Arrays variablen Typs
Beispiel reflektive Programmierung Absatz absatz = …; if (absatz instanceof Regieanweisung) … … (Regieanweisung) absatz … public class Object { public final Class getClass() … } public final class Class extends Object … Constructor[] getConstructors() … Fields[] getFields() … Method[] getMethods() … Typ-Introspektion allg. Introspektion
Weitere einfache Beispiele …
Beispiel Serialisierung class C { int a = 1; String b = "abc"; D d = new D(); void serializeOn(PrintStream aStream) { aStream.println("a"); aStream.println(a); aStream.println("b"); aStream.println(b); aStream.println("d"); d.serializeOn(aStream); }
Reflektive Serialisierung void serializeOn(PrintStream aStream) { Class myClass = getClass(); Field[] myFields = myClass.getFields(); for (Field field : myFields) { aStream.println(field.getName()); try { Object value = field.get(this); if (field.getType().isPrimitive() || value == null) aStream.println(value); else value.printFieldsOn(aStream); } catch (Exception e) {…} }
Weitere Beispiele …
Einsatzmöglichkeiten der Metaprogrammierung Tracing, Logging, Security etc. Spracherweiterungen/-anpassungen Optimierung von Code dynamisch konfigurierte Systeme („very late binding“), z. B. Web Services genetische Programmierung Künstliche Intelligenz
Bewertung der Metaprogrammierung Vorteile: Ergänzung von Funktionalität zur Laufzeit kompaktere Programme Nachteile: schwer lesbar keine Übersetzungszeit, keine Fehlerprüfung Fazit: nur sehr kontrolliert einsetzen!
Geschichtliches Russellsches Paradox Antwort: Russelsche Typtheorie „Dieser Satz ist falsch.“ Antwort: Russelsche Typtheorie Trennung von Aussagen in Ebenen Aussagen nur über Aussagen niedrigerer Ebene Vorläufer heutiger Typsysteme Tarskis Untersuchungen über Wahrheit Trennung von Objekt- und Metasprache
Literatur Abelson & Sussman Structure and Interpretation of Computer Programs Chapter 4: „Metalinguistic Abstraction“ (http://mitpress.mit.edu/sicp/) Krüger, Stark Handbuch der Java-Programmierung Kapitel 43 und 44 (www.javabuch.de) historische Grundlagen Whitehead und Russel Principia Mathematica Vorwort und Einleitungen (1910) Tarski „The semantic conception of truth“ Philosophy and Phenomenological Research 4 (1944)