У вас есть опечатка;domClass.metaClass.invokeMethod{name,args ->
должно быть domClass.metaClass.invokeMethod = { String name,args ->
.Это назначает Closure, чтобы быть обработчиком для всех вызовов метода в этом классе.Поскольку вы обрабатываете вызовы метода, вам нужно знать имя метода и аргументы метода, поэтому это параметры замыкания.Параметр args
будет массивом Object[]
, содержащим аргументы из вызова метода.Так, например, domClass.foo()
будет иметь имя "foo" и пустой массив args
, domClass.foo("purple")
будет иметь массив из 1 элемента, содержащий строку "purple" и т. Д.
Подумайте о delegate
как this
внутри замыкания.this
на самом деле является экземпляром класса, в котором определено Closure, а не самим замыканием или объектом, к которому вызывается метод.Поскольку вам часто нужен объект, delegate
указывает на него.Обычно делегат будет содержащим экземпляром, в котором определено замыкание, поэтому вызовы методов разрешаются путем просмотра там, и, если не найден, выдается исключение отсутствующего метода.Но вы можете установить делегат в качестве другого обработчика, который имеет вызываемые методы, и вместо этого он будет делегирован.Это особенно полезно для сборщиков Groovy и DSL.