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

