前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Groovy: 使用ExpandoMetaClass动态地向类添加方法

Groovy: 使用ExpandoMetaClass动态地向类添加方法

原创
作者头像
白石
修改2019-08-29 18:28:12
2K0
修改2019-08-29 18:28:12
举报
文章被收录于专栏:白石白石

使用ExpandoMetaClass动态地向类添加方法

我们可以动态地向Groovy中的类添加新的行为,比如方法。 所以这意味着一个方法不会添加到源代码中的类定义中,而是添加到应用程序已经运行的类定义中。 为此,Groovy为所有类添加了一个metaClass属性。 这个属性的类型是ExpandoMetaClass。 我们可以将方法(也是静态的),属性,构造函数分配给metaClass属性,并将定义的行为动态添加到类定义中。 在我们添加了行为之后,我们可以创建类的新实例并调用方法,构造函数并像以前一样访问属性。

代码语言:txt
复制
//我们将方法rightShift添加到List类。
//实现只是调用List的remove方法
//提供的参数。
List.metaClass.rightShift {
    delegate.remove it
}

def list = ['one', 'two', 'three', 'four']
assert 4 == list.size()

list.rightShift 'two'
assert 3 == list.size()
assert ['one', 'three', 'four'] == list

// Operator overloading in action: rightShift is >>
list >> 'one'
assert 2 == list.size()
assert ['three', 'four'] == list


//我们还可以向特定实例而不是类添加行为。
//注意我们使用实例列表而不是类List来分配
//方法groovy到metaClass属性。
list.metaClass.groovy {
    delegate.collect { it + ' groovy' }
}

assert ['three groovy', 'four groovy'] == list.groovy()

def newList = ['a', 'b']
try {
    newList.groovy()  // groovy method was added to list instance not List class.
    assert false
} catch (e) {
    assert e instanceof MissingMethodException
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用ExpandoMetaClass动态地向类添加方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档