Groovy: Anhang - Wichtige Klassen und Interfaces
Die Groovy-eigenen Bibliotheken definieren insgesamt über 600 verschiedene Typen -- wobei eingebettete Typen nicht mitgerechnet sind. Wer mit Groovy arbeitet, muss sie natürlich nicht alle kennen. Viele von ihnen sind nur für den Compiler interessant, haben nur interne Bedeutung oder einen sehr speziellen Zweck. Ein paar Klassen und Methoden -- vor allem in den Packages groovy.lang und groovy.util -- sollte man aber durchaus kennen, die wichtigsten sind daher zusammenfassend dokumentiert, wobei wir einige für Anwendungsentwickler weniger interessante Teile auslassen. Weitere Informationen zu den Klassen können der Originaldokumentation oder -- soweit letztere noch Lücke aufweist -- dem Quellcode entnommen werden.
Die Deklaration der Klassen und Interfaces ist hier der wegen der besseren Lesbarkeit wie Groovy-Typen dargestellt. Tatsächlich sind sie in Java programmiert; alle Klassen implementieren aber das Interface GroovyObject und verhalten sich damit wie Groovy-Objekte. Außerdem verwenden wir des Öfteren generische Typen; auch dies ist im Original nicht der Fall, da die Groovy-Bibliotheken noch die Java-Version 1.4 unterstützen, es macht aber die Bedeutung von Argumenten und Rückgabewerten klarer.
Package groovy.lang
BearbeitenDas Package groovy.lang enthält ungefähr analog zu java.lang jene Klassen, die von der Sprache Groovy und der zugehörigen Laufzeitumgebung benötigt werden, um überhaupt funktionieren zu können, oder die ansonsten von grundlegender Bedeutung sind.
Interfaces
BearbeitenAdaptingMetaClass
Bearbeitenpublic interface AdaptingMetaClass extends MetaClass { MetaClass getAdaptee() void setAdaptee (MetaClass mc) }
Interface für Klassen, die als Adapter bzw. Proxies für Metaklassen dienen. Alle Methodenaufrufe einer Klasse, die dieses Interfaces implementiert, sollten an den adaptee weitergeleitet werden, sofern sie nicht von der Klasse selbst behandelt werden.
Properties
- MetaClass adaptee
- Die Metaklasse, für die diese Klasse den Adapter bildet.
GroovyInterceptable
Bearbeitenpublic interface GroovyInterceptable extends GroovyObject {}
Marker-Interface ohne eigene Properties und Methoden. Bei Groovy-Klassen, die dieses Interface implementieren, werden alle Methodenaufrufe über die Methode invokeMethode() geleitet, sodass sie innerhalb der Klasse abgefangen werden können.
GroovyObject
Bearbeiteninterface GroovyObject { MetaClass getMetaClass () void setMetaClass (MetaClass metaClass) Object getProperty (String property) void setProperty (String property, Object newValue) Object invokeMethod (String name, Object args) }
Dieses Interface implementieren alle vom Groovy-Compiler übersetzten Klassen. Es kann auch von Java-Klassen implementiert werden, die wie Groovy-Objekte behandelt werden sollen; allerdings bietet sich in diesem Fall die Verwendung der abstrakten Klassen GroovyObjectSupport an, die eine Standardimplementierung von GroovyObject enthält.
Properties
- MetaClass metaClass
- Referenz auf die für die implementierende Klasse zuständige Metaklasse. Normalerweise ist dies die in der MetaClassRegistry für diese Klasse registrierte Metaklasse; indem Sie hier eine andere Metaklasse zuordnen, können Sie das Verhalten des Objekts maßgeblich beeinflussen.
Methoden
- Object invokeMethod (String name, Object args)
- Diese Methode wird innerhalb eines Groovy-Programms immer dann aufgerufen, wenn für den jeweiligen Aufruf keine direkte Implementierung vorhanden ist, sodass der Methodenaufruf dynamisch behandelt werden kann. Wenn das Objekt zusätzlich das Marker-Interface GroovyInterceptable implementiert, wird jeder Methodenaufruf an invokeMethod() geleitet. Der Parameter name enthält den Methodennamen und der Parameter args die Argumente -- normalerweise in der Form eines Object-Arrays.
- Object getProperty (String name)
- Liefert den Wert der Property mit dem angegebenen Namen.
- void setProperty (String name, Object wert)
- Setzt die Property mit dem angegebenen Namen auf den angegebenen Wert.
- MetaClass getMetaClass()
- Liefert die dem Objekt zugeordnete Instanz der Metaklasse, an die verschiedene Methoden weitergeleitet werden.
- Object getProperty (String property)
- Ermittelt die Property mit dem angegebenen Namen.
- Object invokeMethod(String name, Object args)
- Ruft die Methode auf, deren Name angegeben und deren Argumente (als Array oder einzelnes Objekt) angegeben sind.
- void setMetaClass(MetaClass metaClass)
- Setzt die dem Objekt zugeordnete Instanz der Metaklasse. Ermöglicht es, das Verhalten eines einzelnen Objekts zu beeinflussen.
- void setProperty(String property, Object newValue)
- Setzt die Property mit dem angegebenen Namen auf den neuen Wert.
Interceptor
Bearbeiteninterface Interceptor { Object beforeInvoke (Object object, String name, Object[] args) Object afterInvoke (Object object, String name, Object[] args, Object result) boolean doInvoke() }
Implementierungen dieses Interfaces können im Zusammenhang mit der ProxyMetaClass dazu verwendet werden, Methoden- und Property-Aufrufe abzufangen.
Methoden
- boolean doInvoke()
- Das Ergebnis dieser Methode entscheidet darüber, ob die Originalmethode überhaupt aufgerufen wird. Ist es false, so unterbleibt der Aufruf der Originalmethode und deren Ergebnis wird durch das Ergebnis von beforeInvoke() ersetzt.
- Object beforeInvoke (Object object, String name, Object[] args)
- Diese Methode wird vor dem Aufruf der Zielmethode aufgerufen. Das Ergebnis ersetzt das Ergebnis der Originalmethode, wenn doInvoke() den Wert false liefert.
- Object afterInvoke (Object object, String name, Object[] args, Object result)
- Wird nach der Originalmethode aufgerufen, wenn doInvoke() das Ergebnis true hat, und andernfalls direkt nach beforeInvoke(). Die Parameter sind das Objekt, an dem die Originalmethode aufgerufen wird, der Name der Methode, die Argumente des Aufrufs sowie das Ergebnis der Originalmethode bzw. das Ergebnis von beforeInvoke().
MetaClass
Bearbeiteninterface MetaClass extends MetaObjectProtocol
Interface für Metaklassen, die das Verhalten von Groovy- und Java-Objekten wesentlich beeinflussen. In der Regel wird die Standardimplementierung MetaClassImpl angewendet.
Dieses Interface definiert zahlreiche Properties und Methoden, von denen viele nur für die interne Implementierung wesentlich sind; der vom Anwendungsprogrammierer sinnvoll nutzbare Teil des Interfaces ist in #MetaObjectProtocol definiert und dort erläutert.
MetaClassRegistry
Bearbeiteninterface MetaClassRegistry
Interface für ein Singleton-Objekt, bei dem zu jeder im Programm vorkommenden Klasse die zugehörige Metaklassen-Instanz registriert ist. Die im aktuellen Programm gültige Instanz kann mit Hilfe der statischen Methode GroovySystem.getMetaClassRegistry() ermittelt werden.
Methoden
- MetaClass getMetaClass (Class klasse)
- Liefert die zu einer bestimmten Klasse registrierte Metaklassen-Instanz.
- void setMetaClass (Class klasse, MetaClass metaKlasse)
- Setzt die Metaklassen-Instanz zu einer bestimmten Klasse.
- void removeMetaClass (Class klasse)
- Entfernt die aktuell der angegebenen Klasse zugeordnete Metaklassen-Instanz. Danach muss ein Aufruf von getMetaClass() wieder die Standard-Metaklasse liefern.
MetaObjectProtocol
Bearbeiteninterface MetaObjectProtocol
Dieses Interface definiert die Teile einer Metaklasse (siehe #MetaClass), die für Anwendungsprogrammierer sinnvoll nutzbar sind.
Properties
- Class theClass
- Nur lesend. Die Klasse, für die die aktuelle Metaklassen-Instanz zuständig ist.
Methoden
- Object invokeConstructor (Object[] args)
- Ruft den Konstruktor der zugeordneten Klasse mit den im Array args enthaltenen Argumenten auf. Das Ergebnis ist eine Instanz dieser Klasse.
- Object invokeMethod (Object objekt, String name, Object[] args)
- Ruft die Methode mit dem angegebenen Namen mit den im Array angegebenen Argumenten an dem Objekt auf. Das Objekt muss eine Instanz der Klasse sein, der die aktuelle Metaklasse zugeordnet ist. Wenn die Methode nicht existiert, wird eine MissingMethodException ausgelöst.
- Object invokeMethod (Object objekt, String name, Object arg)
- Ruft die Methode mit dem angegebenen Namen mit einem einzelnen Argument an dem Objekt auf. Das Objekt muss eine Instanz der Klasse sein, der die aktuelle Metaklasse zugeordnet ist. Wenn die Methode nicht existiert, wird eine MissingMethodException ausgelöst.
- Object invokeStaticMethod(Object objekt, String name, Object[] args)
- Ruft die statische Methode mit dem angegebenen Namen mit den im Array angegebenen Argumenten auf. Wenn die Methode nicht existiert, wird eine MissingMethodException ausgelöst.
- Object getProperty (Object objekt, String name)
- Ruft die Property mit dem angegebenen Namen bei dem Objekt ab. Das Objekt muss eine Instanz der Klasse sein, der die aktuelle Metaklasse zugeordnet ist. Was geschieht, wenn die Property nicht existiert, hängt von der zugeordneten Klasse ab.
- void setProperty (Object objekt, String name, Object wert)
- Setzt die Property mit dem angegebenen Namen bei dem Objekt. Das Objekt muss eine Instanz der Klasse sein, der die aktuelle Metaklasse zugeordnet ist. Was geschieht, wenn die Property nicht existiert, hängt von der zugeordneten Klasse ab.
- Object getAttribute (Object objekt, String name)
- Ruft das Attribut mit dem angegebenen Namen bei dem Objekt ab. Das Objekt muss eine Instanz der Klasse sein, der die aktuelle Metaklasse zugeordnet ist. Was geschieht, wenn das Attribut nicht existiert, hängt von der zugeordneten Klasse ab.
- void setAttribute (Object objekt, String name, Object wert)
- Setzt das Attribut mit dem angegebenen Namen bei dem Objekt. Das Objekt muss eine Instanz der Klasse sein, der die aktuelle Metaklasse zugeordnet ist. Was geschieht, wenn das Attribut nicht existiert, hängt von der zugeordneten Klasse ab.
MutableMetaClass
Bearbeiteninterface MutableMetaClass
Definiert zusätzliche Methoden für eine Metaklasse, der dynamisch Methoden hinzugefügt werden können. Dies sollte allerdings nur so lange geschehen, wie die Methode initialize() der Metaklasse nicht aufgerufen worden ist.
Methoden
- void addNewInstanceMethod (Method methode)
- Fügt der Metaklasse eine neue Instanzmethode hinzu. Diese Methode kann eine Originalmethode der zugeordneten Klasse überschreiben.
- void addNewStaticMethod(Method method)
- Fügt der Metaklasse eine neue statische Methode hinzu. Diese Methode kann eine Originalmethode der zugeordneten Klasse überschreiben.
- void addMetaMethod (MetaMethod metaMethode)
- Fügt der Metaklasse eine neue Meta-Methode hinzu. Die Meta-Methode ist ein Objekt, mit dem eine konkrete Methode beschrieben wird.
- void addMetaBeanProperty (MetaBeanProperty metaBeanProperty)
- Fügt der Metaklasse eine neue Meta-Property hinzu. die Meta-Property ist eine von der abstrakten Klasse MetaBeanProperty abgeleitetes Objekt, das eine Property mit ihren Getter- und Setter-Methoden beschreibt.
PropertyAccessInterceptor
Bearbeiteninterface PropertyAccessInterceptor extends Interceptor
Erweitert das Interface Interceptor um Methoden, mit deren Hilfe das Auslesen und Setzen von Properties bei einer ProxyMetaClass abgefangen werden kann.
Methoden
- public Object beforeGet (Object objekt, String name)
- Wird vor der Auslesen einer Property mit dem angegebenen Namen bei dem Objekt ausgeführt. Das Ergebnis dieser Methode ersetzt den Wert der Original-Property, wenn doGet() den Wert false liefert.
- public void beforeSet (Object objekt, String name, Object wert)
- Wird vor dem Setzen einer Property mit dem angegebenen Namen bei dem Objekt ausgeführt.
Range
Bearbeitenpublic interface Range extends List
Interface zur Repräsentation eines Wertebereichs, das heißt eine Folge von Werten mit ganzzahligem Abstand mit einer Ober- und einer Untergrenze. Wird durch verschiedene konkrete Arten von Wertebereichten implementiert.
Properties
- Comparable from
- Nur zu lesen. Definiert den Startwert des Wertebereichs.
- Comparable To
- Nur zu lesen. Definiert den Endwert des Wertebereichs.
- boolean reverse
- Nur zu lesen. Hat den Wert true, wenn der Wertebereich umgekehrt ist, also wenn der Startwert größer als der Endwert ist.
Methoden
- boolean containsWithinBounds (Object o)
- Prüft, ob sich der angegebene Wert innerhalb der Grenzen des Wertebereichs befindet. Ermöglicht es, einen Wertebereich als ein Intervall zu betrachten.
- String inspect()
- Liefert eine textuelle Darstellung des Intervalls in der Form, wie es in einem Programm definiert werden würde.
Writable
Bearbeiteninterface Writable
Interface für Klassen, die eine effiziente direkte Ausgabe ihres Inhalts ermöglichen. Damit kann bei komplexeren Klassen der Aufruf der toString()-Methode übergangen werden, da die Objekte direkt als Text in den Writer geschrieben werden.
Methoden
- Writer writeTo (Writer out)
- Schreibt eine textuelle Repräsentation des aktuellen Objekts in den angegebenen Writer.
Klassen
BearbeitenBenchmarkInterceptor
Bearbeitenclass BenchmarkInterceptor implements groovy.lang.Interceptor
Beispiel für die Implementierung eines Interceptor für die ProxyMetaClass. Speichert die Ausführungszeiten von Methodenaufrufen und ermöglicht einfache Auswertungen. Es sind nur ####
Properties
- Map calls
- Nur zu lesen. Eine Map mit den gespeicherten Laufzeiten.
Methoden
- List statistics()
- Liefert die Ergebnisse in tabellarischer Anordnung.
- void reset()
- Setzt die gespeicherten Laufzeitwerte zurück auf Null.
Binding
Bearbeitenclass groovy.lang.Binding
Jedes Skript verfügt über ein Behälterobjekt vom Typ Binding zum speichern von Skriptvariablen. Die nicht-lokalen Variablen eines Skripts (also jene Variablen, die weder durch eine Typangabe noch durch das Schlüsselwort def zu lokalen Variablen der Skriptmethode erklärt werden). Das Binding kann außerhalb des Skripts von einem aufrufenden Programm bereits mit Werten belegt worden sein, und nach der Beendigung des Skriptlaufs ist es zum Auslesen der Variablen verfügbar.
Da Binding die Klasse GroovyObjectSupport erweitert, stehen alle Properties und Methoden eines standardmäßigen Groovy-Objekts zur Verfügung.
Konstruktoren
- Binding ()Binding (Map variablen)
- Legt eine neue Binding-Instanz an. Wenn eine Map übergeben wird, sollte diese nur Werte mit String-Schlüssel enthalten, da dies die Namen der Variablen sind. Der gesamte Inhalt der Map wird in das Binding übernommen. Wird keine Map übergeben, so ist das neue Binding leer.
- Binding (String [] args)
- Legt eine neue Binding-Instanz an, die das String-Array als Variable mit dem Namen args enthält.
Properties
Neben den Properties des Groovy-Objekts und den im Folgenden aufgeführten spezifischen Properties sind nachrangig auch alle im Binding gespeicherten Variablen als Properties verfügbar.
- Map<String,Object> variables
- Nur zu lesen. Interne Map, die zum Speichern der Binding-Variablen verwendet wird.
Methoden
- Object getProperty (String name)
- Überschreibt die standardmäßige Methode so, dass die Binding-Variablen auch als Properties oder mit dem Index-Operator ausgelesen werden können.
- Object getVariable (String name)
- Liefert den Wert der Binding-Variablen mit dem angegebenen Namen. Wenn es keine Variable mit diesem Namen gibt, ist das Ergebnis null.
- void setProperty (String name)
- Überschreibt die standardmäßige Methode so, dass die Binding-Variablen auch als Properties oder mit dem Index-Operator gesetzt werden können.
- void setVariable (String name, Object wert)
- Setzt eine Binding-Variable mit dem angegebenen Namen und dem angegebenen Wert. Wenn bereits eine Variable mit dem Namen vorhanden ist, wird sie überschrieben.
Closure
Bearbeitenpublic abstract class Closure implements Cloneable, Runnable
Abstrakte Basisklasse für alle vom Compiler übersetzten Closures.
Konstanten
- public final static int DONE = 1
- public final static int SKIP = 2
- Siehe Property directive.
Properties
- Object delegate
- Delegate-Objekt. An dieses Objekt werden alle Methodenaufrufe innerhalb der Closure weitergeleitet, die es nicht schon im Eigentümerobjekt gibt. Ist anfänglich identisch mit dem Eigentümerobjekt.
- int directive
- Property zum Steuern des Verhaltens in Schleifen. Es kann einer der Werte DONE und SKIP gesetzt werden. Die Auswertung dieser Flags findet in den rekursiven Methoden statt.
- int maximumNumberOfParameters
- Nur zu lesen. Anzahl der deklarierten Parameter der Closure, dieser Wert ist immer mindestens 1.
- Object owner
- Nur zu lesen. Eigentümerobjekt der Closure. Im Kontext dieses Objekts ist die Closure erzeugt worden, und an dieses Objekt werden alle Methodenaufrufe geleitet. Wenn die Closure in einer statischen Methode erzeugt worden ist, ist das Eigentümerobjekt die Class-Instanz.
- Class[] parameterTypes
- Nur zu lesen. Typen der deklarierten Parameter der Closure.
Methoden
- <T> T asType (Class<T> einInterface)
- Spezialisierung des as-Operators für Closures. Mit seiner Hilfe kann eine Closure als dynamische Implementierung eines beliebigen Interface verwendet werden. Alle Aufrufe des resultierenden Objekts werden mit alle Parametern an die Closure weitergeleitet, und der Rückgabewert der Closure wird als Rückgabewert des Methodenaufrufs geliefert. (Als vordefinierte Methode implementiert.)
- Writable asWritable ()
- Liefert ein Wrapper-Objekt zu dieser Closure, die das Interface Writable implementiert. Die zugehörige writeTo()-Methode ruft die Closure auf und übergibt ihr den Writer als Argument.
- Object call (Object[] args)
- Ruft die Closure ohne Argumente, mit einem Argument oder mit einem Array von Argumenten auf.
- Closure curry (Object[] args)
- Liefert eine neue Closure mit derselben Funktionalität, allerdings ist ein Teil der Parameter der ursprünglichen Closure mit den Argumenten der curry()-Methode belegt, so dass nur die neue Closure nur noch die unbelegten Parameter annimmt.
- Object getProperty (String name)
- Versucht die Property zuerst beim Eigentümerobjekt und wenn dies nicht möglich ist und es ein Delegate-Objekt gibt, es beim Delegate-Objekt zu lesen.
- boolean isCase (Object kandidat)
- Implementierung der switch-case-Verzweigung. Ruft die Closure-Methode mit dem Argument auf und wandelt das Ergebnis in einen Booleschen Wert.
- void run ()
- Implementierung des Interface Runnable; ermöglicht es, eine Closure auch als eigenen Thread zu starten. Der Aufruf wird einfach an die Closure-Methode weitergeleitet.
- void groovy.lang.Closure#setProperty (String name, Object wert)
- Versucht die Property zuerst beim Eigentümerobjekt und wenn dies nicht möglich ist und es ein Delegate-Objekt gibt, es beim Delegate-Objekt auf einen neuen Wert zu setzen.
DelegatingMetaClass
Bearbeitenclass DelegatingMetaClass implements MetaClass, MutableMetaClass
Implementierung der Metaklasse, die alle Methodenaufrufe an eine andere, als Delegate dienende Metaklasse weiterleitet. Sie können von dieser Klasse eine eigene Klasse ableiten, um darin einzelne Methoden zu überschreiben und die Aufrufe abzufangen. Welche Methoden überschrieben werden können, ist den Erläuterungen zu dem Interface #MetaObjectProtocol zu entnehmen.
Konstruktoren
- DelegatingMetaClass (MetaClass delegate)
- Erzeugt eine neue DelegatingMetaClass, die alle Aufrufe an die als Argument übergebene Metaklasse weiterleitet.
- DelegatingMetaClass (Class klasse)
- Erzeugt eine neue DelegatingMetaClass, die alle Aufrufe an Metaklasse weiterleitet, die der als Argument übergebenen Klasse zugeordnet ist.
Methoden
- public void setAdaptee (MetaClass delegate)
- Setzt die Metaklasse, an die alle Aufrufe weitergeleitet werden.
Weitere Methoden sind bei dem Interface MetaObjectProtocol dargestellt.
ExpandoMetaClass
Bearbeitenpublic class ExpandoMetaClass extends MetaClassImpl implements GroovyObject
Eine Metaklasse, die es auf einfache Weise ermöglicht, zusätzliche Methoden und Properties für einen Typ zu definierten.
Konstruktoren
- ExpandoMetaClass (Class typ)
- Erzeugt eine neue ExpandoMetaClass für den angegebenen Typ.
- ExpandoMetaClass (Class typ, boolean register)
- Erzeugt eine neue ExpandoMetaClass für den angegebenen Typ. Wenn register auf true gesetzt ist, wird sie auch gleich bei der MetaClassRegistry angemeldet-
Methoden
- static void enableGlobally()
- Ermöglicht die globale Nutzung der ExpandoMetaClass. Diese Methode muss am Anfang des Programms einmal aufgerufen werden, wenn Methoden und Properties der ExpandoMetaClass vererbt werden sollen und wenn sie auch Interfaces und abstrakten Klassen definiert zugeordnet werden soll-.
package java.util
BearbeitenKlassen
BearbeitenExpando
Bearbeitenclass Expando extends GroovyObjectSupport
Die Klasse Expando erweitert die Basisklasse GroovyObjectSupport und implementiert dadurch auch das Interface groovy.lang.GroovyObject. Seine wesentliche Funktionalität besteht darin, dass es Zugriffe auf Properties und Methoden so "verbiegt", dass sie auf die Elemente einer internen Map verwiesen werden. Hier folgen die wichtigsten Properties, Konstruktoren und Methoden dieser Klasse.
Properties
Map properties (nur zum Lesen)
- Die Property properties repräsentiert die interne Map mit den Namen und Werten aller Properties des Expando-Objekts.
Konstruktoren
- Expando()
- Standard-Konstruktor
- Expando(java.util.Map expandoProperties)
- Dieser Konstruktor erlaubt die Übergabe einer Map mit Name-Wert-Paaren, die eine Vorbelegung für die Elemente des Expando darstellen.
Methoden
- boolean equals (Object obj)
- int hashCode()
- String toString()
- Alle drei Methoden prüfen zunächst, ob es eine Closure mit dem Namen der Methode gibt und rufen gegebenenfalls diese auf. Wenn nicht, delegieren sie den Aufruf an die korrespondierende in GroovyObjectSupport definierte Methode weiter.
- Object getProperty (String property)
- Liefert einen Wert mit dem Namen aus der internen Map.
- Object invokeMethod (String name, Object args)
- Versucht zunächst die Methode auf normale Weise aufzurufen. Wenn dies nicht möglich ist, prüft sie, ob es eine Closure namens name in der internen Map gibt, deren Parameterliste passt, und ruft gegebenenfalls diese auf.
- void setProperty (String property, Object newValue)
- Setzt einen Wert mit dem Namen property in der internen Map.