En primer lugar, anulando Object.metaClass.invokeMethod
no funciona porque cuando Groovy intenta resolver una llamada a un método para un tipo X, comprueba la metaClass de X, pero no la metaClass de su (s) clase (s) primaria (s). Por ejemplo, el siguiente código imprimirá "método intValue interceptado"
Integer.metaClass.invokeMethod = {def name, def args ->
System.out.println("method $name intercepted")
}
6.intValue()
// Reset the metaClass
Integer.metaClass = null
Pero este código no:
Object.metaClass.invokeMethod = {def name, def args ->
System.out.println("method $name intercepted")
}
6.intValue()
// Reset the metaClass
Object.metaClass = null
Su pregunta fue: "¿Es posible interceptar todos los métodos llamados en una aplicación? ", pero podría ser un poco más preciso acerca de si desea:
- interceptar llamadas a Groovy métodos, los métodos de Java, o ambos
- interceptar llamadas a sólo sus métodos Groovy/Java o también interceptar llamadas a librerías de clases Groovy/Java
Por ejemplo, si sólo desea interceptar llamadas a sus clases Groovy, podría cambiar sus clases para implementar GroovyInterceptable. Esto asegura que se invoca invokeMethod() para cada método llamado en esas clases. Si la naturaleza de la interceptación (es decir, las cosas que desea hacer antes/después de invocar el método llamado) es la misma para todas las clases, puede definir invokeMethod()
en una clase separada y usar @Mixin
para aplicarla a todas sus clases.
Alternativamente, si también desea interceptar llamadas a las clases de Java, debe verificar el DelegatingMetaClass.
Esto probablemente no sea una buena idea. ¿Qué está tratando de lograr? – noah