我们已经有了一个Foo类groovy,如下:

class Foo {

deftest()

println'have a test'

def foo()

println'foogroovy。。。'

现在,我们要在该类的基础上新增一个“testAgain”方法groovy。

  我们使用“DelegatingMetaClass”类来实现这个功能groovy,我们创建一个类来继承它,如下:

import orggroovy。codehaus。groovy。runtime。InvokerHelper

class FooDelegateingMetaClass extends groovygroovy。

  langgroovy。DelegatingMetaClass{

FooDelegateingMetaClass(final Class aclass)

super(aclass);

initialize()

public Object invokeMethod(Object a_object, String a_methodName, Object[] a_arguments)

if(a_methodName == 'testAgain')

println'test again'

return''

else

supergroovy。

  invokeMethod(a_object, a_methodName, a_arguments)

可以看到,这个类的实现非常的简单groovy。一共只有两个方法:一个构造器,一个“invokeMethod”方法。

构造器的实现都是一样的:一是把构造器的final Class对象传给父类(即“DelegatingMetaClass”)构造器;接着调用初始化方法,即“initialize”groovy。

“invokeMethod”方法的实现思想是把扩展的方法留给自己实现,把旧的方法交给父类对象实现,即完成了委派动作groovy。

下面来测试我们刚刚生成的委派类:

def myMetaClass = new FooDelegateingMetaClass(Foogroovy。

  class)

def invoker = InvokerHelpergroovy。instance

invokergroovy。metaRegistry。setMetaClass(Foo。class, myMetaClass)

def foo = new Foo()

foogroovy。

  test()

foogroovy。foo()

foogroovy。testAgain()

“FooDelegateingMetaClass”类的构造器参数是指动作(如“test”和“foo”)要委派到的目的类,在我们的例子中是“Foo”类groovy。

而第三行“invokergroovy。

  metaRegistrygroovy。setMetaClass(Foo。class, myMetaClass)”则是指委派动作的类,在我们的例子中也是“Foo”类。

有关metaClass的一些知识,我们将单独提出来阐述,这里就不再说明groovy。

运行上面的测试代码groovy,可以得到如下的结果:

have a test

foogroovy。

  groovy。。

test again

上面演示了在运行期内给一个类扩展功能的方法groovy。比如,我们想给String类增加“testAgain”,也可以使用上面的“FooDelegateingMetaClass”类,代码如下:

def myMetaClass = new FooDelegateingMetaClass(Stringgroovy。

  class)

def invoker = InvokerHelpergroovy。instance

invokergroovy。metaRegistry。setMetaClass(String。class, myMetaClass)

def str = "ok"

strgroovy。

groovy,Groovy探索之Delegate模式是什么?

  testAgain()

println str

运行结果为:

test again

ok

到了这里groovy,你可能要问了,我有一个Foo4类,想继承Foo类的方法,能够使用上面的“FooDelegateingMetaClass”类吗?

比如有Foo4类如下:

class Foo4 {

当然可以,我们只需要把“invokergroovy。

  metaRegistrygroovy。setMetaClass(Foo。class, myMetaClass)”中的委派动作的类改为Foo4类即可,如下:

def myMetaClass = new FooDelegateingMetaClass(Foogroovy。

  class)

def invoker = InvokerHelpergroovy。instance

invokergroovy。metaRegistry。setMetaClass(Foo4。class, myMetaClass)

def foo = new Foo4()

foogroovy。

  test()

foogroovy。foo()

foogroovy。testAgain()

运行看看:

have a test

foogroovy。。。

groovy,Groovy探索之Delegate模式是什么?

test againgroovy。

  • 随机文章

  • 热门文章

  • 热评文章

本文地址:http://www.jsqccz.com/shxzs/2317.html
如觉得本文对你有用,请随意打赏