Я начинал изучать Groovy, и в настоящее время смотрю на функциональность метакласса. Я видел примеры добавления нового метода и удаления всех методов, но ничего об удалении отдельного метода. Например:
String.metaClass.foo = {delegate.toUpperCase()}
String.metaClass.bar = {delegate.toLowerCase()}
с очевидными побочными эффектами. Теперь я видел, что можно сказать
String.metaClass = null
Удалить все методы. Я ожидал бы, что можно было сказать что-то вроде
String.metaClass.foo = null
чтобы удалить String.foo (), но иметь String.bar () остаются, однако этот оператор, кажется, не имеет эффекта. Существует ли способ сказать, что нечто метода () больше не должно определяться, не производя панель () или никакие другие добавленные методы?
Если вы выполните поиск эта веб-страница для "метода удаления" говорит, что вы должны иметь возможность удалить метод, используя точный синтаксис, который вы предложили выше. Но я проверил, и вы правы, похоже, не работает.
Обходной путь - назначить закрытие, которое выдает MissingMethodException
, что происходит по умолчанию, когда вы вызываете метод, который не существует, например
// Add method
String.metaClass.foo = {delegate.toUpperCase()}
// Remove method
def removeMethod = {throw new MissingMethodException()}
String.metaClass.foo = removeMethod
По общему признанию, это не самое приятное решение.
В качестве продолжения, я опубликовал сообщение об ошибке здесь:
https://issues.apache.org/jira/browse/GROOVY-4189
И документация теперь изменена
См. сообщение об ошибке для причины, по которой это так и не было реализовано
Ответ Дона - лучший способ обойти это
.