groovy – metaClass.methods和metaClass.metaMethods有什么区别
如果我向类添加元方法,我希望它出现在Class.metaClass.metaMethods中.但事实似乎并非如此.特别是,如果我这样做:
class Example { def realFoo() { "foo" } } Example.metaClass.metaFoo = { -> "foo" } def reals = Example.metaClass.methods*.name.grep{it.contains("Foo")} def metas = Example.metaClass.metaMethods*.name.grep{it.contains("Foo")} println "reals = $reals,metas = $metas" 我希望reals的输出= [realFoo],metas = [metaFoo],但实际上我得到的是reals = [realFoo,metaFoo],metas = []. 看起来新的元方法存储在方法中,而不是metaMethods.那么,metaClass.methods和metaClass.metaMethods有什么区别? 解决方法
MetaMethods包含Groovy在类上修饰的那些方法,但实际上并不是类的直接部分或它的继承结构,或者是通过metaClass手动插入类的方法.
这些在DefaultGroovyMethods类中定义. 根据您要实例化的对象类型,它主要是迭代器,如每个,收集,查找等. 对代码的这种修改显示了仅限元,仅“真实”和共享的方法: class Example { def realFoo() { "foo" } } Example.metaClass.metaFoo = { -> "foo" } def reals = Example.metaClass.methods.name.sort().unique() def metas = Example.metaClass.metaMethods.name.sort().unique() def metaOnly = metas - reals def realOnly = reals - metas def shared = reals.findAll { metas.contains(it) } println """ metaOnly = $metaOnly realOnly = $realOnly shared = $shared """ 结果: metaOnly = [addShutdownHook,any,asBoolean,asType,collect,dump,each,eachWithIndex,every,find,findAll,findIndexOf,findIndexValues,findLastIndexOf,findResult,getAt,getMetaPropertyValues,getProperties,grep,hasProperty,identity,inject,inspect,is,isCase,iterator,metaClass,print,printf,println,putAt,respondsTo,sleep,split,sprintf,use,with] realOnly = [equals,getClass,getProperty,hashCode,metaFoo,notify,notifyAll,realFoo,setProperty,wait] shared = [getMetaClass,invokeMethod,setMetaClass,toString] 所有metaOnly和shared方法都在DefaultGroovyMethods中.所有“真正的”方法都在类本身上,或者在它的父类(在本例中为Object)上,加上一些直接与metaClass相关的groovy事物来获取/设置metaClass以及getProperty / setProperty和invokeMethod它允许您覆盖方法行为. 如果你想搜索所有方法以查看存在的内容,我会使用以下内容: def allMethods = (Example.metaClass.methods + Example.metaClass.metaMethods).name.sort().unique() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |