O'Reilly logo

Groovy: Grundlagen und fortgeschrittene Techniken by Joachim Baumann

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

265
7 Das Meta Object Protocol
Bisher haben wir uns nicht mit der Frage beschäftigt, wie Groovy es
schafft, die extreme Flexibilität auf einer klassischen Java Virtual
Machine zu implementieren.
In diesem Kapitel beschäftigen wir uns mit dem Meta Object
Protocol, das dies erlaubt. Außerdem lernen wir mehrere Mechanis-
men kennen, die das Meta Object Protocol in verschiedener Weise ver-
wenden.
Sie sollten zumindest Kapitel 4 und 5 gelesen haben, um problem-
los folgen zu können.
7.1 Einführung
Groovy schafft es, innerhalb der Beschränkungen der Java Virtual
Machine Erstaunliches zu leisten. Dinge, von denen wir wissen, dass
sie mit Java und der Virtual Machine nicht machbar sind, wie Opera-
tor Overloading oder typlose Variablen, bietet Groovy trotzdem ohne
nennenswerte Probleme. Dabei werden wir die wirklich interessanten
Dinge in diesem Bereich erst in diesem Kapitel kennenlernen.
Das Meta Object Protocol oder MOP ist hierbei keine neue Erfin-
dung von Groovy, sondern schon ziemlich alt. Viele Sprachen, unter
ihnen Smalltalk, Common Lisp oder Objective C, unterstützen es in
variierenden Graden.
Das MOP ermöglicht es uns zum Beispiel, Klassen zu programmie-
ren, die zur Laufzeit entscheiden, ob sie eine Methode implementieren
oder ein Attribut haben wollen oder nicht.
Eine weitere Eigenschaft des MOP ist die Möglichkeit, die Funkti-
onalität von Klassen zur Laufzeit zu verändern, Methoden oder Attri-
bute hinzufügen oder entfernen. Das Beispiel, das wir alle schon ken-
nen, sind die Erweiterungen der Java-Klassen durch Groovy.
7 Das Meta Object Protocol266
7.1.1 Was ist das Meta Object Protocol?
Eigentlich ist das Meta Object Protocol eine ganz simple Sache. Jede
Klasse in Groovy bekommt eine zugeordnete Metaklasse. Jeder
Zugriff auf ein Objekt dieser Klasse führt zuerst zu einem Aufruf der
zugeordneten Metaklasse. Diese kann jetzt entscheiden, was mit dem
Zugriff zu tun ist. Die einfachste und normale Möglichkeit ist, den
Zugriff einfach an das Objekt selber weiterzuleiten. Wenn wir aber wie
bei den Java-Klassen Methoden im Nachhinein zur Verfügung stellen
wollen, dann muss die Metaklasse, falls eine Methode im Originalob-
jekt nicht existiert, diese auf andere Weise zur Verfügung stellen.
Das Ganze wird jetzt dadurch ein wenig verkompliziert, dass wir
manchmal in der Lage sein wollen/müssen, diese Modifikationen nicht
typweit, also für alle Instanzen unserer Klasse, durchzuführen, son-
dern spezifisch für einzelne Instanzen machen wollen.
7.1.2 Die nächsten Schritte
Bevor wir uns dem Meta Object Protocol im Detail zuwenden,
betrachten wir zuerst die verschiedenen Sprachmittel, die uns Groovy
im Zusammenhang mit dem Meta Object Protocol bietet. Sie werden
feststellen, dass die existierenden Möglichkeiten in fast allen Fällen
völlig ausreichen und Sie das MOP nicht selber manipulieren müssen.
Natürlich ist es aber trotzdem interessant, was unter der Haube
passiert und wie wir an verschiedenen Stellen eingreifen können. Des-
halb werden wir uns zum Schluss des Kapitels in die Tiefen der Reali-
sierung des Meta Object Protocol begeben.
7.2 Categories
Categories ermöglichen es uns, existierenden Klassen zur Laufzeit
Methoden hinzuzufügen oder die existierenden Methoden durch
eigene Methoden zu überschreiben; eine eventuell vorhandene Origi-
nalmethode ist also nicht mehr erreichbar.
Dies funktioniert nicht nur für Groovy-Klassen, sondern genauso
gut mit Java-Klassen. Die meisten Probleme, die wir durch das Meta
Object Protocol lösen wollen, können wir mit Categories lösen. Die
Vielseitigkeit ihrer Verwendung kennt kaum Grenzen.
Wir deklarieren die Verwendung einer Category mit dem Schlüs-
selwort
use, das als Parameter eine durch Kommata getrennte Liste
von Categories akzeptiert. Categories sind hierbei Groovy- oder Java-
2677.2 Categories
Klassen, die Funktionalität in vorgegebener Weise zur Verfügung stel-
len (dies werden wir gleich detaillierter betrachten).
Die Gültigkeit von Categories ist hierbei beschränkt auf den dem
Schlüsselwort
use folgenden, durch geschweifte Klammern eingefass-
ten Block von Anweisungen.
Listing 7–1
Die Verwendung einer
Category
use(Category) {
...
}
use(Category1, Category2, Category3) {
...
}
Eine Klasse, die wir als Category verwenden wollen, muss die Cate-
gory-Methoden als Klassenmethoden zur Verfügung stellen. Der erste
Parameter der jeweiligen Methode bestimmt dabei die Zielklasse der
Category-Methode und erlaubt uns innerhalb der Methode, auf das
Objekt zuzugreifen, für das die Methode aufgerufen wurde. Wenn wir
als ersten Parameter also den Typ
Object angeben, wird die Category
auf alle Objekte angewendet; alle Objekte – in Java und in Groovy –
sind von
Object abgeleitet. Auf diese Weise könnten wir also println
nachbilden, wenn es diese Anweisung nicht schon gäbe. Die verblei-
benden Parameter sind die Parameter, die der Category-Methode beim
Aufruf übergeben werden.
Listing 7–2
Aufbau einer Category-
Klasse, Beispiel
class MyCategory {
static categoryMethod(Zielklasse zk, param1, param2) {
...
}
}
0HNEDASSWIRBISJETZTWISSENWIE$ATEGORIESFUNKTIONIERENKjNNENWIR
NUR AUS DIESER *NFORMATION SCHLIEeEN DASS $ATEGORIES ZUMINDESTAUF
*NSTANZENOPERIERENMkSSEN
8ARUM 8ENNINUNSERER"PPLIKATIONMEHRERE5HREADSLAUFENUND
DAS TUN SIE SEHR HhUFIG DANN WERDEN NICHT ALLE 5HREADS GLEICHZEITIG
DURCHDIESEN#LOCKVON"NWEISUNGENLAUFEN8kRDEJETZTALSOEINE$ATE
GORYALLE*NSTANZENEINER,LASSEMODIFIZIERENDANNWkRDEDIE.ODIFIKA
TIONAUCHAUeERHALBDES#LOCKSWIRKSAMSEINWASGEGENDIE#ESCHRhN
KUNGDER(kLTIGKEITVERSTIEeE
&SISTSOGARSODASSDIE#INDUNGANDIE*NSTANZENNICHTAUSREICHT
8ENNDURCHMEHRERE5HREADSZURGLEICHEN;EITAUFEIN0BJEKTZUGEGRIFFEN
WIRDSOWOHLINNERHALBALSAUCHAUeERHALBDES#LOCKSDANNDkRFENNUR
DIE5HREADSINNERHALBDES#LOCKSDIE$ATEGORY'UNKTIONALIThTVERWENDEN
KjNNEN%IEANDEREN5HREADSDkRFENDIESE'UNKTIONALIThTNICHTSEHEN
Detailinformation

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required