7

我已经开始学习 Groovy,目前正在研究元类功能。我已经看到了添加新方法和删除所有方法的示例,但没有看到删除单个方法的示例。例如:

String.metaClass.foo = {delegate.toUpperCase()}
String.metaClass.bar = {delegate.toLowerCase()}

具有明显的副作用。现在我看到你可以说

String.metaClass = null

删除所有方法。我希望人们可以说一些类似的东西

String.metaClass.foo = null

删除 String.foo(),但保留 String.bar(),但是此语句似乎没有任何效果。有没有办法说不应该再定义方法 foo() 而不影响 bar() 或任何其他添加的方法?

4

2 回答 2

7

如果您在此网页上搜索“删除方法”,则表明您应该能够使用您上面提出的确切语法删除方法。但是我测试了它,你是对的,它似乎不起作用。

一种解决方法是分配一个 throws 的闭包MissingMethodException,这是当您调用不存在的方法时默认发生的情况,例如

// Add method
String.metaClass.foo = {delegate.toUpperCase()}

// Remove method
def removeMethod = {throw new MissingMethodException()}
String.metaClass.foo = removeMethod

诚然,这不是最令人满意的解决方案。

于 2010-04-30T15:42:31.207 回答
2

作为后续,我在这里发布了一个错误报告:

https://issues.apache.org/jira/browse/GROOVY-4189

现在文档已经更改

请参阅错误报告以了解从未实施的原因

唐的回答是解决这个问题的最好方法

于 2010-05-07T13:26:42.467 回答