Groovy - Programmation de méta-objets

La programmation de méta-objets ou MOP peut être utilisée pour appeler des méthodes de manière dynamique et également créer des classes et des méthodes à la volée.

Qu'est-ce que cela signifie? Considérons une classe appelée Student, qui est une sorte de classe vide sans variables ni méthodes membres. Supposons que vous deviez invoquer les instructions suivantes sur cette classe.

Def myStudent = new Student() 
myStudent.Name = ”Joe”; 
myStudent.Display()

Maintenant, dans la programmation de méta-objets, même si la classe n'a pas la variable membre Name ou la méthode Display (), le code ci-dessus fonctionnera toujours.

Comment cela peut-il fonctionner? Eh bien, pour que cela fonctionne, il faut implémenter l'interface GroovyInterceptable pour se connecter au processus d'exécution de Groovy. Voici les méthodes disponibles pour cette interface.

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) 
}

Donc, dans la description de l'interface ci-dessus, supposons que si vous deviez implémenter invokeMethod (), elle serait appelée pour chaque méthode qui existe ou qui n'existe pas.

Propriétés manquantes

Regardons donc un exemple de la façon dont nous pouvons implémenter la programmation de méta-objets pour les propriétés manquantes. Les éléments clés suivants doivent être notés à propos du code suivant.

  • La classe Student n'a pas de variable membre appelée Nom ou ID défini.

  • La classe Student implémente l'interface GroovyInterceptable.

  • Il existe un paramètre appelé dynamicProps qui sera utilisé pour contenir la valeur des variables membres qui sont créées à la volée.

  • Les méthodes getproperty et setproperty ont été implémentées pour obtenir et définir les valeurs des propriétés de la classe au moment de l'exécution.

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]
   } 
}

La sortie du code suivant serait -

Joe 
1

Méthodes manquantes

Regardons donc un exemple de la façon dont nous pouvons implémenter la programmation de méta-objets pour les propriétés manquantes. Les éléments clés suivants doivent être notés à propos du code suivant -

  • La classe Student implémente maintenant la méthode invokeMethod qui est appelée indépendamment du fait que la méthode existe ou non.

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"
   }
}

La sortie du code suivant doit être affichée ci-dessous. Notez qu'il n'y a pas d'erreur d'exception de méthode manquante même si la méthode Display n'existe pas.

Joe 
1

Métaclasse

Cette fonctionnalité est liée à l'implémentation MetaClass. Dans l'implémentation par défaut, vous pouvez accéder aux champs sans appeler leurs getters et setters. L'exemple suivant montre comment, en utilisant la fonction metaClass, nous pouvons modifier la valeur des variables privées de la classe.

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;
   } 
}

La sortie du code suivant serait -

Joe 
Mark

Méthode manquante

Groovy prend en charge le concept de methodMissing. Cette méthode diffère de invokeMethod en ce qu'elle n'est invoquée qu'en cas d'échec de l'envoi d'une méthode, lorsqu'aucune méthode ne peut être trouvée pour le nom donné et / ou les arguments donnés. L'exemple suivant montre comment la méthode methodMissing peut être utilisée.

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"
   }  
}

La sortie du code suivant serait -

Joe 
1 
Missing method