移除单个元类方法

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()或其他添加的方法呢?

2个回答

7
如果你在这个网页中搜索“remove method”,它会告诉你应该能够使用你上面提出的确切语法来删除一个方法。但是我测试了一下,你是正确的,它似乎不起作用。
解决方法是分配一个抛出MissingMethodException的闭包(当调用不存在的方法时默认会发生这种情况),例如:
// Add method
String.metaClass.foo = {delegate.toUpperCase()}

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

诚然,这并不是最令人愉悦的解决方案。

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

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

“文档已经被修改了。
请查看错误报告,了解为什么这个功能从未被实现。
唐的答案是绕过这个问题的最佳方法。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接