加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

groovy – metaClass.methods和metaClass.metaMethods有什么区别

发布时间:2020-12-14 16:24:41 所属栏目:大数据 来源:网络整理
导读:如果我向类添加元方法,我希望它出现在Class.metaClass.metaMethods中.但事实似乎并非如此.特别是,如果我这样做: class Example { def realFoo() { "foo" }}Example.metaClass.metaFoo = { - "foo" }def reals = Example.metaClass.methods*.name.grep{it.co
如果我向类添加元方法,我希望它出现在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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读