Вопрос по – Groovy - переопределение invokeMethod для одного экземпляра

4

У меня есть экземпляр объекта Java, скажем, экземпляр ArrayList с именем myList.

Для этого конкретного случая я хочу переопределить метод invokeMethod, чтобы (скажем) записать, что метод был вызван.

Я мог бы сделать что-то вроде этого:

<code>myList.metaclass.invokeMethod { name, args -> 

   println "Called ${name} with ${args}"
   whatGoesHere.invokeMethod(name, args)

}
</code>

Обратите внимание на 2-ю строку замыкания - как я могу вызвать оригинальный метод invokeMethod? Я правильно об этом говорю?

Похоже на этот ответ: Узнай имя метода в Groovy Arturo Herrero
Arturo, этот ответ относится ко всему классу, а не к одному экземпляру. Roy Truelove
Мы можем добавить новое поведение к экземпляру или классу точно так же, какExpandoMetaClass свойство Arturo Herrero

Ваш Ответ

1   ответ
5

существует более короткий путь к исходному методу, но это должно сработать:

def myList = [ 1, 2, 3 ]

myList.metaClass.invokeMethod { name, args -> 
   println "Called ${name} with ${args}"
   delegate.class.metaClass.getMetaMethod( name, args )?.invoke( delegate, args )
}

myList.sum()
Более подробный ответ на этот вопрос для обработки varargs: Stackoverflow.com / а / 31143363/1509221 brunobowden
Есть ли способ действительно вызвать оригинальную функцию invokeMethod? Если какой-то другой код уже изменил invokeMethod в метаклассе, чтобы что-то сделать, если вы используете вышеописанную технику, вы перезапишите их invokeMethod. burns
Я обнаружил, что это не удалось в случае функций varargs, где метод передавал ArrayList.args будет иметь тип Object [] с ArrayList в качестве элемента ... поэтому он успешно совпадает сgetMetaMethod. Я полагаю, что проблема в том, что он не может привести ArrayList к объекту [], поэтому он завершается сIllegalArgumentException: argument type mismatch. В моем случае, обходным путем было переключение некоторых типов с ArrayList на Object [], и это работало правильно. Было бы немного поработать, чтобы выяснить, что такоеinvokeMethod исправить было бы. brunobowden

Похожие вопросы