2011-11-25 14 views
7

Czy można odsłuchać wykonanie metody instancji lub wszystkich instancji klasy, bez modyfikowania ich kodu? Coś jak:Czy istnieje sposób, aby posłuchać innej metody klasy?

someInstance.addMethodExecutionListener('methodName', handler); 
SomeClass.addMethodExecutionListener('methodName', handler); 

Byłoby dla celów rejestrowania ...

+0

Więc czego chcesz. Czy musisz być powiadamiany za każdym razem, gdy funkcja 'methodName()' zaczyna działać? –

+0

Dokładnie i bez modyfikowania kodu klasy. –

Odpowiedz

5

Co pytasz o to niewielki podzbiór co można zrobić z Aspect Oriented Programming. Nie jest obsługiwany w zwykłej Javie i jej implementacjach, ale jest głównym powodem dla AspectJ.

2

W zależności od środowiska można korzystać z różnych technologii. Wiosna zapewnia Aspects, że można powiązać niektóre zdarzenia (np. Wykonanie metody).

Jeśli korzystasz z środowiska zarządzanego kontenerami Java EE, możesz użyć usługi EJB lub dla usług WWW.

0

Jednym ze sposobów jest wykorzystanie API narzędziowego JVMTI (zastępuje oddzielne interfejsy API do debugowania i profilowania).

W przeciwnym razie można przepisać pliki klas, aby wstawić kod przed kodem metody. To niekoniecznie łatwe. ASM jest dobry do manipulacji kodami bajtowymi na niskim poziomie, ale możesz chcieć użyć jakiejś biblioteki (lub napisać własną) lub ewentualnie użyć jakiegoś "aspektu" narzędzia.

Kod bajtowy można z łatwością przepisać "na dysku" przed załadowaniem lub w środowisku wykonawczym za pomocą instrumentation API i -javaagent: w wierszu poleceń.

Powiązane problemy