元对象协议 Meta Object Protocol

元对象协议 Meta Object Protocol


魔术般的 MOP

元对象协议不是 Groovy 独有的,它也不是由 Groovy 发明者发明的。事实上,它的身世可追溯到 LISP 和 AOP 背后的一些人。考虑到这种身世,MOP 受到 Groovy 的见多识广的创造者们的欢迎就毫不奇怪了。

在 Groovy 中可以实现 MOP 是因为,在 Groovy land中每一个对象都隐式地实现 groovy.lang.GroovyObject,它定义了 invokeMethod()和 getProperty()两个方法。在运行时,如果向一个对象传递消息,而这个对象不是作为类或者其子类中定义的属性或者方法存在,那么就调用 getProperty()或者 invokeMethod()方法。

groovy.lang.GroovyObject

package groovy.lang;

import groovy.lang.MetaClass;

public interface GroovyObject {
    Object invokeMethod(String var1, Object var2);

    Object getProperty(String var1);

    void setProperty(String var1, Object var2);

    MetaClass getMetaClass();

    void setMetaClass(MetaClass var1);
}

在清单 1 中,我定义了 Groovy 类 MOPHandler,它实现了 invokeMethod()和 getProperty()。当创建了 MOPHandler的一个实例后,可以调用任意数量的方法或者属性,并看到它打印出说明调用了什么的消息。

class MOPHandler {

    def invokeMethod(String method, Object params) {
        println "MOPHandler was asked to invoke ${method}"
        if (params != null) {
            params.each { println "\twith parameter ${it}" }
        }
    }

    def getProperty(String property) {
        println "MOPHandler was asked for property ${property}"
    }
}

def hndler = new MOPHandler()
hndler.helloWorld()
hndler.createUser("Joe", 18, new Date())
hndler.name

运行并输出,

MOPHandler was asked to invoke helloWorld

MOPHandler was asked to invoke createUser

with parameter Joe

with parameter 18

with parameter Wed Apr 22 19:47:40 CST 2015

MOPHandler was asked for property name

是不是很不错? MOP 就像一个安全网,捕捉传递错误的消息,但是这不是它最妙的功能。用它创建可以以 一般的方式智能地对传递进来的任何消息作出响应的智能对象,才是它的最大亮点。



你可能感兴趣的:(元对象协议 Meta Object Protocol)