彩票走势图

Groovy探索之MOP 三 Class、MetaClass和ExpandoMetaClass

原创|其它|编辑:郝浩|2009-04-09 10:00:04.000|阅读 575 次

概述:Class当然是Groovy语言从Java语言继承来的,这就是说Groovy语言也继承了Java语言的反射机制。这意味着我们能够像在Java语言里使用反射那样,在Groovy语言里写出诸如下面的代码:

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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 Class本身的hook,包括重载"invokeMethod"和"set/getProperty"方法,和重载"methodMissing" 和"propertyMissing"方法。这些方法都已经在不同的文字中反复被提及,在这里就不再重述。

  第二, 就是通过MetaClass来实现的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, String methodName, Object[] args)
Object invokeStaticMethod(Object obj, String methodName, Object[] args)
Object invokeConstructor(Object[] args)

  分别用来调用方法、静态方法和属性。同时,我们还有一些用来自省的属性和方法,如:"properties"、"respondsTo"和"hasProperty"等等。

  所以,我们要想使用MetaClass来实现MOP机制,就需要实现一个我们自己的MetaClass,然后把它通过"setMetaClass"方法set到GroovyObject对象中,从而达到使用MetaClass的目的。

  很显然,要通过这种方法来实现Groovy语言的MOP机制不是很灵活,远不如上面的hook好用。

  第三, 就是通过ExpandoMetaClass来实现的MOP机制

 据说,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类也可以对单独的对象进行添加方法和属性,体现了极大的灵活性和动态性。

  所有这些,都将会在以后的篇幅中详细描述,在这里就不再细说。

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:blog.csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP