Groovy and Grails Recipes翻译之旅——面向对象的Groovy(14)

<!--[if !supportLists]-->4.14.           <!--[endif]-->什么是元类(Metaclass),如何使用它?

Groovy对象都实现了groovy.lang.GroovyObject接口。如果想把Java类当作Groovy类使用,您必须实现这个接口。您也可以继承groovy.lang.GroovyObjectSupport类,该类可作为一个基类,并提供了缺省的实现。每个Groovy对象都有一个元类(metaclass),可通过调用GroovyObject接口的getMetaClass方法获得。元类提供了该类的所有元数据,例如该类拥有的方法、成员和属性等,也可以用来调用该类的任何方法。GroovyObject接口默认地把它的所有方法传递给对应的元类,例如invokeMethodgetPropertysetProperty。元类被存储在被称为MetaClassRegistry的存储中心,它负责缓存所有的元类的实例。

当您调用Groovy对象的方法,该方法可通过以下3种方式被调用:

<!--[if !supportLists]-->l  <!--[endif]-->使用该对象的invokeMethod方法实现

<!--[if !supportLists]-->l  <!--[endif]-->使用该对象元类的invokeMethod方法:getMetaClass().invokeMethod()

<!--[if !supportLists]-->l  <!--[endif]-->使用该对象注册到MetaClassRegistry的元类

元类是Groovy的元对象协议(Meta Object ProtocolMOP)实现的一部分,它能帮助您在运行时改变系统的行为。MOP能帮您拦截方法,实现面向方面编程(aspect-oriented programmingAOP)。它也帮助您传递方法调用给其他对象(例如闭包可把它的方法传递给它对应的代理类),并且而其他的逻辑pretend to execute a method while another logic is performed(例如生成器builders)。

清单4.33向我们展示了如何使用对象的元类来获得该类的所有方法和属性等。而且,它还演示了如何使用respondsTohasProperty方法用于查明该类是否支持某一方法或属性。

 

清单4.33 元类的应用

println Object.metaClass.methods //Returns all methods in java.lang.Object

def a = [1,2,3]

println a.metaClass.methods //Returns all methods in java.util.List

println a.metaClass.metaMethods //Returns all methods injected by the

                               //GKDK in java.util.List

println java.io.File.metaClass.properties //Returns all meta

                      //preoprties in the java.io.File class

 

class Meta{

    String property

    def noArgs() {"method 1"}

    def printMe(String arg1) {println "method 2 with $arg1"}

    def abs(Integer arg1){arg1.abs()}

}

 

def meta = new Meta()

 

assert meta.metaClass.respondsTo(meta, "noArgs")

assert meta.metaClass.respondsTo(meta, "printMe")

assert meta.metaClass.respondsTo(meta, "printMe", String)

assert !meta.metaClass.respondsTo(meta, "printMe", Integer)

assert meta.metaClass.respondsTo(meta, "abs", Integer)

assert meta.metaClass.hasProperty(meta, "property")

你可能感兴趣的:(JavaScript,AOP,编程,grails,groovy)