2012-04-12 3 views
4

Java 객체의 인스턴스가 있습니다. myList라는 ArrayList의 인스턴스를 예로 들어 보겠습니다.Groovy - 단일 인스턴스에 대한 invokeMethod 재정의

이 특정 인스턴스에서는 invokeMethod 메서드를 재정의하여 해당 메서드가 호출 된 로그를 말하고 싶습니다. - 어떻게 원래 invokeMethod 메소드를 호출 할 수

myList.metaclass.invokeMethod { name, args -> 

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

} 

공지 폐쇄의 두 번째 라인 :이 같은 뭔가를 할 수

? 나는 이것에 관해 정확하게 가고 있냐?

+0

유사이 대답 : ([그루비의 메소드의 이름을 찾기] http://stackoverflow.com/a/ 10113215/462015) –

+0

Arturo, unf이 답변은 전체 인스턴스에 적용되는 것이 아니라 전체 클래스에 적용됩니다. –

+0

'ExpandoMetaClass' 속성을 사용하여 인스턴스 또는 클래스에 새로운 비헤이비어를 추가 할 수 있습니다. –

답변

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() 
+0

메서드가 ArrayList를 전달하는 varargs 함수의 경우 실패했습니다. 'args'는 ArrayList를 요소로하는 Object [] 타입이 될 것이므로 ... getMetaMethod와 성공적으로 매치됩니다. 나는 그 문제가 그것이 ArrayList를 Object []에 강요하지 못한다고 믿기 때문에'IllegalArgumentException : argument type mismatch'와 함께 실패한다. 필자의 경우, 해결 방법은 ArrayList에서 Object []로 일부 유형을 전환하는 것이었고 제대로 작동했습니다. 적절한'invokeMethod' 픽스가 무엇인지 알아내는 일이 될 것입니다. – brunobowden

+0

varargs 처리에 대한보다 광범위한 대답 : http://stackoverflow.com/a/31143363/1509221 – brunobowden

관련 문제