删除单元类方法

时间:2010-04-30 15:22:53

标签: groovy metaclass

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

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

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

String.metaClass = null

删除所有方法。我希望有人可以说出

的内容
String.metaClass.foo = null

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

2 个答案:

答案 0 :(得分:7)

如果您在this webpage搜索“删除方法”,则表示您应该能够使用上面提到的确切语法删除方法。但我测试了它,你是对的,它似乎没有用。

解决方法是分配一个抛出MissingMethodException的闭包,这是默认情况下调用不存在的方法时发生的情况,例如。

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

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

不可否认,这不是最令人满意的解决方案。

答案 1 :(得分:2)

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

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

文档现已更改

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

Don的答案是围绕这个

的最好方法