Domanda

È possibile intercettare tutti i metodi chiamati in un'applicazione? Mi piacerebbe fare qualcosa con loro e poi lasciarli eseguire. Ho provato a ignorare questo comportamento in Object.metaClass.invokeMethod , ma non sembra funzionare.

È possibile?

È stato utile?

Soluzione

Hai guardato Groovy AOP ? C'è pochissima documentazione , ma consente definire punti e consigli in modo concettualmente simile a quello di AspectJ. Dai un'occhiata al

Altri suggerimenti

Innanzitutto, l'override di Object.metaClass.invokeMethod non funziona perché quando Groovy tenta di risolvere una chiamata del metodo per un tipo X, controlla la metaClass di X, ma non la metaClass di le sue classi principali. Ad esempio, il codice seguente stamperà "metodo intValue intercettato"

Integer.metaClass.invokeMethod = {def name, def args ->
  System.out.println("method $name intercepted")
}

6.intValue()

// Reset the metaClass  
Integer.metaClass = null  

Ma questo codice non lo farà:

Object.metaClass.invokeMethod = {def name, def args ->
  System.out.println("method $name intercepted")
}

6.intValue()

// Reset the metaClass  
Object.metaClass = null

La tua domanda era " È possibile intercettare tutti i metodi chiamati in un'applicazione? " ;, ma potresti essere un po 'più preciso se vuoi:

  • Intercetta le chiamate ai metodi Groovy, ai metodi Java o entrambi
  • Intercetta le chiamate solo a i tuoi metodi Groovy / Java o intercetta anche le chiamate alle classi della libreria Groovy / Java

Ad esempio, se desideri intercettare solo le chiamate alle tue classi Groovy, puoi cambiare le tue classi per implementare GroovyInterceptable . Questo assicura che invokeMethod () sia invocato per ogni metodo chiamato su quelle classi. Se la natura dell'intercettazione (ovvero le cose che vuoi fare prima / dopo aver invocato il metodo chiamato) è la stessa per tutte le classi, puoi definire invokeMethod () in una classe separata e usare @Mixin per applicarlo a tutte le tue classi.

In alternativa, se si desidera intercettare anche le chiamate alle classi Java, è necessario controllare DelegatingMetaClass .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top