首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails:用于方法的ExpandoMetaClass

Grails:用于方法的ExpandoMetaClass
EN

Stack Overflow用户
提问于 2014-06-17 17:26:02
回答 2查看 108关注 0票数 2

考虑一种方法

代码语言:javascript
复制
 def public Set<AgeRange> getAgeRanges(boolean excludeSenior) {
           -- something ---
     }

如何为此编写ExpandoMetaClass

代码语言:javascript
复制
    ClassName.metaClass.methodName << { boolean excludeSenior->
           -- something ---
       }
EN

回答 2

Stack Overflow用户

发布于 2014-06-17 18:21:40

我在Groovy控制台中尝试了一下,它起作用了:

代码语言:javascript
复制
class Something {

    Set getAgeRanges(boolean excludeSenior) {
        [1, 2, 3] as Set
    }
}

// test the original method
def s = new Something()
assert s.getAgeRanges(true) == [1, 2, 3] as Set

// replace the method
Something.metaClass.getAgeRanges = { boolean excludeSenior ->
    [4, 5, 6] as Set
}

// test the replacement method
s = new Something()
assert s.getAgeRanges(true) == [4, 5, 6] as Set
票数 1
EN

Stack Overflow用户

发布于 2014-06-18 03:35:21

我真的不确定你在问什么,但这可能会证明你在寻找什么:

一些类:

代码语言:javascript
复制
class SomeClass {
    List<Integer> ages
}

一些元编程将方法添加到类中:

代码语言:javascript
复制
SomeClass.metaClass.agesOlderThan { int minimumAge ->
    // note that "delegate" here will be the instance
    // of SomeClass which the agesOlderThan method
    // was invoked on...
    delegate.ages?.findAll { it > minimumAge }
}

创建一个SomeClass实例并调用新方法...

代码语言:javascript
复制
def sc = new SomeClass(ages: [2, 12, 22, 32])

assert sc.agesOlderThan(20) == [22, 32]

这有帮助吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24260162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档