大佬教程收集整理的这篇文章主要介绍了Groovy探索之MOP 十二 方法的调用顺序,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们知道,除了使用hook来拦截方法以外,我们还可以通过各种方式来实现方法。如,我们可以在类里直接实现方法;我们可以通过ExpandoMetaClass在运行期内添加方法;我们还可以通过ExpandoMetaClass在运行期内单独给一个对象添加方法。
所有的这些直接添加方法的途径,如果存在hook的话,都是要被hook拦截的。所以,我们可以说,系统是优先调用hook的。
而Hook的调用顺序,我们在上一篇《Groovy探索之MOP 十一 运行期内覆盖invokeMethod》已经谈到过了。
本篇要谈到,却是除了hook方法以外的方法实现途径的调用顺序的问题。
我们都知道,如果有如下的一个类:
class Foo {
def getFoo()
'foo'
}
}
def foo = new Foo()
println foo.foo
运行结果为:
foo
这就是我们的Gpath。
当然,我们也可以通过ExpandoMetaClass在运行期内添加这个"get"方法,如下:
'Meta'
}
如果我们再做下面的测试:
def foo = new Foo()
println foo.foo
那么,运行结果为:
从结果可以看出,在运行期内通过ExpandoMetaClass添加的方法是会覆盖类本身的方法的。
def mc = new ExpandoMetaClass(Foo.class,true)
mc.getFoo = {
->
}
mc.initialize()
下面,我将对上面的Foo类,在运行期内同时实行上面的两种方法的添加方式,然后在做测试,看看结果将会如何?
代码如下:
'Meta'
}
def mc = new ExpandoMetaClass(Foo.class,true)
mc.getFoo = {
->
}
mc.initialize()
def foo = new Foo()
println foo.foo
}
运行结果为:
far
由此可见,后一种在运行期内添加方法的方式是会覆盖前一种在运行期内添加方法的方式的。
除此之外,我们还有一种在运行期内给对象添加方法的方式,如下:
def emc = new ExpandoMetaClass( foo.class,false )
emc.getFoo = {
emc.initialize()
foo.MetaClass = emc
最后,我们还将写代码来测试这最后一种方式与前几种方式的调用顺序。代码如下:
def mc = new ExpandoMetaClass(Foo.class,true)
mc.getFoo = {
->
}
mc.initialize()
def foo = new Foo()
def emc = new ExpandoMetaClass( foo.class,false )
emc.getFoo = {
emc.initialize()
foo.MetaClass = emc
println foo.foo
运行结果为:
test
可以看出,使用上面的方式在运行期内给一个对象添加的方法,会覆盖通过ExpandoMetaClass在运行期内给一个类添加的方法。
以上是大佬教程为你收集整理的Groovy探索之MOP 十二 方法的调用顺序全部内容,希望文章能够帮你解决Groovy探索之MOP 十二 方法的调用顺序所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。