Groovy - Meta 元对象编程

Meta 元对象编程或 MOP 可用于动态调用方法,也可以动态创建类和方法。

那么这是什么意思? 让我们考虑一个名为 Student 的类,它是一个没有成员变量或方法的空类。 假设您必须在此类上调用以下语句。

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

现在在元对象编程中,即使类没有成员变量 Name 或方法 Display(),上面的代码仍然可以工作。

这怎么行? 好吧,要实现这一点,必须实现 GroovyInterceptable 接口以挂钩到 Groovy 的执行过程。 以下是此接口可用的方法。

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

所以在上面的接口描述中,假设你必须实现invokeMethod(),它会被每个存在或不存在的方法调用。


缺少属性

让我们看一个示例,说明如何针对缺失的属性实现元对象编程。 以下代码需要注意以下关键事项。

  • Student 类没有定义名为 Name 或 ID 的成员变量。

  • Student 类实现了 GroovyInterceptable 接口。

  • 有一个名为dynamicProps的参数,用于保存动态创建的成员变量的值。

  • 已实现 getproperty 和 setproperty 方法,用于在运行时获取和设置类的属性值。

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

以下代码的输出将是 −

Joe 
1 
Missing method