首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy运行时方法拦截

Groovy运行时方法拦截
EN

Stack Overflow用户
提问于 2012-09-05 17:37:08
回答 3查看 1.6K关注 0票数 1

我在玩Groovy,我想知道,为什么这段代码不能工作?

代码语言:javascript
复制
package test

interface A {
    void myMethod()
}

class B implements A {
    void myMethod() {
        println "No catch"
    }
}

B.metaClass.myMethod = {
    println "Catch!"
}

(new B()).myMethod()

它打印No catch,而我希望它打印Catch!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-05 21:35:52

这是Groovy中的一个bug,在JIRA中也有一个公开的问题:不能通过元类覆盖属于接口实现GROOVY-3493的方法。

票数 9
EN

Stack Overflow用户

发布于 2012-09-05 21:36:22

不要重写B.metaClass.myMethod,而是尝试执行以下操作:

代码语言:javascript
复制
 B.metaClass.invokeMethod = {String methodName, args ->
    println "Catch!"
 }

这个blog post很好地描述了这一点。

票数 1
EN

Stack Overflow用户

发布于 2015-07-01 03:49:19

有一个解决方法,但它只适用于所有类,而不适用于特定实例。

在构造之前修改元类:

代码语言:javascript
复制
interface I {
    def doIt()
}

class T implements I {
    def doIt() { true }
}

I.metaClass.doIt = { -> false }
T t = new T()
assert !t.doIt()

构建后的元类修改:

代码语言:javascript
复制
interface I {
    def doIt()
}

class T implements I {
    def doIt() { true }
}

T t = new T()
// Removing either of the following two lines breaks this
I.metaClass.doIt = { -> false }
t.metaClass.doIt = { -> false }
assert !t.doIt()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12278477

复制
相关文章

相似问题

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