Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass
????????? Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass ? ? ? Class当然是Groovy语言从Java语言继承来的,这就是说Groovy语言也继承了Java语言的反射机制。这意味着我们能够像在Java语言里使用反射那样,在Groovy语言里写出诸如下面的代码: import java.lang.reflect.Method ? class Testor { ??? ??? def testDelegate() ??? { ?????? 'ok' ??? } ? ? static void main(args) { ??? ? ??? ? def t = new Testor() ??? ? ??? ? Class cls = t.class ??? ? ??? ? Method method = cls.getMethod('testDelegate',null) ??? ? ??? ? println method.invoke(t,null) ? } ? } ? ? 当然,我们在Groovy语言里很少会这样用了,因为Groovy语言的MOP机制比起Java语言的反射机制来说,强大的很多倍。 总结来说,Groovy语言的MOP机制主要由以下几种方法来实现:
在Groovy语言中,所有的类都起源于GroovyObject接口,该接口中有如下的两个方法: ? public MetaClass getMetaClass(); public void?? ???setMetaClass(MetaClass metaClass); ? 我们的所有对象的MetaClass对象,都是通过这两个方法而来的。 在MetaClass对象中,我们可以实现如下的一些方法: Object invokeMethod(Object obj,String methodName,Object args) Object invokeMethod(Object obj,Object[] args) Object invokeStaticMethod(Object obj,Object[] args) Object invokeConstructor(Object[] args) ? 分别用来调用方法、静态方法和属性。同时,我们还有一些用来自省的属性和方法,如:"properties"、"respondsTo"和"hasProperty"等等。 ? 所以,我们要想使用MetaClass来实现MOP机制,就需要实现一个我们自己的MetaClass,然后把它通过"setMetaClass"方法set到GroovyObject对象中,从而达到使用MetaClass的目的。 很显然,要通过这种方法来实现Groovy语言的MOP机制不是很灵活,远不如上面的hook好用。 ?
据说,ExpandoMetaClass类的使用,起源于Grails项目,由于它实现MOP机制的极大方便性,从Groovy1.1开始,就被引入到了Groovy语言的核心API。 与上面的MetaClass类不同的是,MetaClass类是通过Groovy的对象的"setMetaClass"和"getMetaClass"引入;而ExpandoMetaClass类是由"java.lang.Class"类的"metaClass"引入。 如下面的例子: class Testor5 { ??? ??? private delegate ??? ??? def testDelegate() ??? { ?????? 'ok' ??? } ? ? static void main(args) { ??? ? ??? ? def t = new Testor5() ??? ? ??? ? ??? ? t.testDelegate() ??? ? ??? ? Testor5.metaClass.test = { ?????? ? -> ?????? ? ? 'invoke test function' ??? ? } ??? ? ??? ? def t1 = new Testor5() ??? ? ??? ? println t1.test() ? ? } ? } ? 当然,ExpandoMetaClass类也可以对单独的对象进行添加方法和属性,体现了极大的灵活性和动态性。 所有这些,都将会在以后的篇幅中详细描述,在这里就不再细说。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |