Przede wszystkim nadrzędnymi Object.metaClass.invokeMethod
nie działa, ponieważ gdy Groovy próbuje rozwiązać wywołanie metody dla typu X, sprawdza metaClass X, ale nie metaClass jego rodzica (klas). Na przykład, następujący kod wypisze „metoda intValue przechwycone”
Integer.metaClass.invokeMethod = {def name, def args ->
System.out.println("method $name intercepted")
}
6.intValue()
// Reset the metaClass
Integer.metaClass = null
ale ten kod nie będzie:
Object.metaClass.invokeMethod = {def name, def args ->
System.out.println("method $name intercepted")
}
6.intValue()
// Reset the metaClass
Object.metaClass = null
Twoje pytanie brzmiało: „Czy to możliwe, aby przechwytywać wszystkie metody zwane w aplikacji? ”, ale może być nieco dokładniej o to, czy chcesz:
- Intercept wzywa do Groovy metody, metody Java lub zarówno
- Intercept wzywa do zaledwie twoi metody Groovy/Java czy też przechwytywanie połączeń do klas bibliotecznych Groovy/Java
Na przykład, jeśli chcesz tylko przechwytywanie połączeń do swoich Groovy klas, można zmienić swoje zajęcia do wdrożenia GroovyInterceptable. Zapewnia to wywołanie metody invokeMethod() dla każdej metody wywoływanej na tych klasach. Jeśli charakter przechwytywania (tj. Elementy, które chcesz wykonać przed/po wywołaniu wywoływanej metody) jest taki sam dla wszystkich klas, możesz zdefiniować invokeMethod()
w oddzielnej klasie i użyć @Mixin
, aby zastosować ją do wszystkich swoich zajęć.
Ewentualnie, jeśli chcesz przechwytywać połączenia z klasami Java, powinieneś sprawdzić numer DelegatingMetaClass.
To chyba nie jest dobry pomysł. Co próbujesz osiągnąć? – noah