Frage

Ist es möglich, alle Methoden in einer Anwendung aufgerufen abfangen? Ich möchte etwas mit ihnen zu tun, und dann lassen Sie sie ausführen. Ich habe versucht, dieses Verhalten in Object.metaClass.invokeMethod außer Kraft zu setzen, aber es scheint nicht zu funktionieren.

Ist das machbar?

War es hilfreich?

Lösung

Haben Sie sich Groovy AOP ? Es gibt sehr wenig Dokumentation , aber es erlaubt Sie pointcuts und Beratung in einer konzeptionell ähnlichen Weise wie für AspectJ zu definieren. Werfen Sie einen Blick auf die Unit-Tests für einige weitere Beispiele

Das folgende Beispiel werden alle Anrufe in alle gewebten Typen entsprechen und den Rat, bevor Sie fortfahren gelten:

// aspect MyAspect
class MyAspect {
  static aspect = {
    //match all calls to all calls to all types in all packages
    def pc = pcall("*.*.*")

    //apply around advice to the matched calls
    around(pc) { ctx ->
      println ctx.args[0]
      println ctx.args.length
      return proceed(ctx.args)
    }
  }
}
// class T
class T {
  def test() {
    println "hello"
  }
}
// Script starts here
weave MyAspect.class
new T().test()
unweave MyAspect.class

Andere Tipps

Zu allererst Object.metaClass.invokeMethod überschrieben, weil nicht funktioniert, wenn Groovy einen Methodenaufruf für einen Typ X zu lösen versucht, überprüft er die Metaklasse von X, aber nicht die Metaklasse seiner Elternklasse (n). Beispielsweise wird der folgende Code drucken „Methode intValue abgefangen“

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

6.intValue()

// Reset the metaClass  
Integer.metaClass = null  

Aber dieser Code nicht:

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

6.intValue()

// Reset the metaClass  
Object.metaClass = null

Ihre Frage lautete: „Ist es möglich, alle Methoden in einer Anwendung aufgerufen abfangen?“, Aber könnten Sie ein bisschen genauer sein, ob Sie wollen:

  • Intercept ruft Methoden stark, Java-Methoden oder beides
  • ruft Intercept nur Ihre Groovy / Java-Methoden oder auch abfangen Anrufe zu Groovy / Java-Bibliothek Klassen

Zum Beispiel, wenn Sie Anrufe an Ihre Groovy Klassen abfangen möchten, können Sie Ihre Klassen ändern implementieren GroovyInterceptable . Dadurch wird sichergestellt, dass InvokeMethod () wird für jede Methode auf diesen Klassen aufgerufen aufgerufen. Wenn die Art der Überwachung (dh das Material, das Sie tun wollen vor / nach der genannten Methode aufgerufen) das gleiche für alle Klassen ist, Sie invokeMethod() in einer separaten Klasse definieren könnten und verwenden @Mixin es auf all Ihren Klassen anzuwenden.

Wenn Sie alternativ auch auf Java-Klassen abfangen Anrufe wollen, sollten Sie die DelegatingMetaClass .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top