Groovy - Meta-Objektprogrammierung
Meta Object Programming oder MOP können verwendet werden, um Methoden dynamisch aufzurufen und Klassen und Methoden im laufenden Betrieb zu erstellen.
Was bedeutet das? Betrachten wir eine Klasse namens Student, eine Art leere Klasse ohne Mitgliedsvariablen oder -methoden. Angenommen, Sie müssten die folgenden Anweisungen für diese Klasse aufrufen.
Def myStudent = new Student()
myStudent.Name = ”Joe”;
myStudent.Display()
In der Metaobjektprogrammierung funktioniert der obige Code weiterhin, obwohl die Klasse weder die Mitgliedsvariable Name noch die Methode Display () enthält.
Wie kann das funktionieren? Damit dies funktioniert, muss die GroovyInterceptable-Schnittstelle implementiert werden, um sich in den Ausführungsprozess von Groovy einzubinden. Im Folgenden sind die für diese Schnittstelle verfügbaren Methoden aufgeführt.
Public interface GroovyInterceptable {
Public object invokeMethod(String methodName, Object args)
Public object getproperty(String propertyName)
Public object setProperty(String propertyName, Object newValue)
Public MetaClass getMetaClass()
Public void setMetaClass(MetaClass metaClass)
}
Angenommen, Sie müssten in der obigen Schnittstellenbeschreibung die invokeMethod () implementieren, die für jede Methode aufgerufen wird, die entweder vorhanden ist oder nicht.
Fehlende Eigenschaften
Schauen wir uns also ein Beispiel an, wie wir die Metaobjektprogrammierung für fehlende Eigenschaften implementieren können. Die folgenden Schlüssel Dinge sollten über den folgenden Code beachtet werden.
In der Klasse Student ist keine Mitgliedsvariable namens Name oder ID definiert.
Die Klasse Student implementiert die GroovyInterceptable-Schnittstelle.
Es gibt einen Parameter namens dynamicProps, der verwendet wird, um den Wert der Mitgliedsvariablen zu speichern, die im laufenden Betrieb erstellt werden.
Die Methoden getproperty und setproperty wurden implementiert, um die Werte der Eigenschaften der Klasse zur Laufzeit abzurufen und festzulegen.
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
}
}
class Student implements GroovyInterceptable {
protected dynamicProps=[:]
void setProperty(String pName,val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
}
Die Ausgabe des folgenden Codes wäre -
Joe
1
Fehlende Methoden
Schauen wir uns also ein Beispiel an, wie wir die Metaobjektprogrammierung für fehlende Eigenschaften implementieren können. Die folgenden Schlüssel Dinge sollten über den folgenden Code beachtet werden -
Die Klasse Student implementiert jetzt die invokeMethod-Methode, die unabhängig davon aufgerufen wird, ob die Methode vorhanden ist oder nicht.
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def invokeMethod(String name, Object args) {
return "called invokeMethod $name $args"
}
}
Die Ausgabe des folgenden Codes wird unten gezeigt. Beachten Sie, dass beim Fehlen der Methodenausnahme kein Fehler auftritt, obwohl die Methode Anzeige nicht vorhanden ist.
Joe
1
Metaklasse
Diese Funktionalität bezieht sich auf die MetaClass-Implementierung. In der Standardimplementierung können Sie auf Felder zugreifen, ohne deren Getter und Setter aufzurufen. Das folgende Beispiel zeigt, wie wir mithilfe der Funktion metaClass den Wert der privaten Variablen in der Klasse ändern können.
class Example {
static void main(String[] args) {
Student mst = new Student();
println mst.getName()
mst.metaClass.setAttribute(mst, 'name', 'Mark')
println mst.getName()
}
}
class Student {
private String name = "Joe";
public String getName() {
return this.name;
}
}
Die Ausgabe des folgenden Codes wäre -
Joe
Mark
Methode fehlt
Groovy unterstützt das Konzept von methodMissing. Diese Methode unterscheidet sich von invokeMethod darin, dass sie nur im Falle eines fehlgeschlagenen Methodenversands aufgerufen wird, wenn für den angegebenen Namen und / oder die angegebenen Argumente keine Methode gefunden werden kann. Das folgende Beispiel zeigt, wie die Methode Missing verwendet werden kann.
class Example {
static void main(String[] args) {
Student mst = new Student();
mst.Name = "Joe";
mst.ID = 1;
println(mst.Name);
println(mst.ID);
mst.AddMarks();
}
}
class Student implements GroovyInterceptable {
protected dynamicProps = [:]
void setProperty(String pName, val) {
dynamicProps[pName] = val
}
def getProperty(String pName) {
dynamicProps[pName]
}
def methodMissing(String name, def args) {
println "Missing method"
}
}
Die Ausgabe des folgenden Codes wäre -
Joe
1
Missing method