删除单元类方法

M. *_*sup 7 groovy metaclass

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

String.metaClass.foo = {delegate.toUpperCase()}
String.metaClass.bar = {delegate.toLowerCase()}
Run Code Online (Sandbox Code Playgroud)

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

String.metaClass = null
Run Code Online (Sandbox Code Playgroud)

删除所有方法.我希望有人能说些什么

String.metaClass.foo = null
Run Code Online (Sandbox Code Playgroud)

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

Dón*_*nal 7

如果您在此网页中搜索"删除方法",则表示您应该能够使用上面提到的确切语法删除方法.但我测试了它,你是对的,它似乎没有用.

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

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

// Remove method
def removeMethod = {throw new MissingMethodException()}
String.metaClass.foo = removeMethod
Run Code Online (Sandbox Code Playgroud)

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