我一直在学习Groovy,目前正在研究元类功能。我已经看到了添加新方法和删除所有方法的示例,但没有关于删除单个方法的示例。例如:
String.metaClass.foo = {delegate.toUpperCase()}
String.metaClass.bar = {delegate.toLowerCase()}
有明显的副作用。现在我已经看到你可以说
了String.metaClass = null
删除所有方法。我希望有人可以说出
的内容String.metaClass.foo = null
删除String.foo(),但仍保留String.bar(),但此语句似乎没有任何效果。有没有办法说方法foo()不应该再定义,而不影响bar()或任何其他添加的方法?
答案 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的答案是围绕这个
的最好方法