2013-04-12 13 views
17

Mam metodę statyczną w niektórych starszych kod, który jest wywoływana przez wielu klientów. Oczywiście nie mam opcji, aby to zmienić lub zmienić zachowanie poprzez zastrzyk zależności. Nie wolno mi modyfikować istniejącej klasy.Jak zmienić zachowanie metody poprzez odbicie?

Co chcę teraz zrobić, to zmienić zachowanie (ta metoda - z tym samym podpisem i typem powrotu) za pomocą odbicia.

Czy to możliwe? Jeśli nie, czy jakikolwiek wzór może mnie uratować?

Dzięki!

EDYCJA: Istnieje pewne zamieszanie na temat tego, co mogę zmienić/zmodyfikować. Nie mogę zmienić żadnej istniejącej klasy/metody - ale mogę dodać więcej klas do projektu. Najlepsze, co mogę zrobić z istniejącymi klasami, jest ich opisywanie. Wszystko po to, aby uniknąć łamania czegokolwiek w istniejącym kodzie - co oznacza pełną rundę testowania dużego projektu.

EDYCJA 2: java.lang.Instrumentation nie jest dostępny dla Androida - a może brzmi jak dobre dopasowanie!

+0

Dlaczego odbicie? –

+3

Nie możesz tego zmienić, ale możesz modyfikować je za pomocą odbicia? To wydaje się bardziej ryzykowne. – Keppil

+0

Myślę, że skończy się to koszmarnym utrzymaniem. Kod będzie leżał na kimś, kto go czyta. Idź i uzyskaj zgodę na zmianę tej klasy. – SpaceTrucker

Odpowiedz

18

Brzmi jak wymóg dziwne ...

Zresztą, odbicie nie pozwalają na zmianę zachowania kodu, może jedynie zbadać aktualny kod, wywoływać metody i constuctors, wartości pól zmieni, tego rodzaju rzeczy.

Jeśli chcesz rzeczywiście zmienić zachowanie metody, musisz użyć biblioteki manipulacji kodu bajtowego, takiej jak ASM. Ale nie będzie to bardzo łatwe, prawdopodobnie nie jest dobrym pomysłem ...

Wzory, które mogą pomóc:

  • Jeśli klasa nie jest ostateczna i może zmodyfikować klientów, rozszerzyć istniejącą klasę i przeciąż metodę, zachowując pożądane zachowanie. Edycja: działałoby to tylko wtedy, gdyby metoda nie była statyczna! programowanie
  • Aspect: dodaj przechwytujących do sposobu korzystania AspectJ

W każdym razie, najbardziej logicznym rozwiązaniem byłoby, aby znaleźć sposób, aby modyfikować istniejące klasy, obejścia będzie tylko uczynić kod bardziej skomplikowane i trudniejsze w utrzymaniu.

Powodzenia.

+0

Metoda statyczna nie może zostać nadpisana. Zastanawiam się, czy refleksja może zmienić wartości pola, dlaczego nie metody! – SlowAndSteady

+0

Jestem nowy w AOP. Odkrywaj to teraz! – SlowAndSteady

+0

Masz rację, oczywiście, że metoda jest statyczna. Odpowiednio zredagowałem swoją odpowiedź. –

8

Domyślam się, że można rzucić okiem na klasę Instrumentation, które mają metodę redefineClasses(ClassDefintion classDefinition).

Redefinicja może zmieniać ciała metod, pulę stałą i atrybuty. Redefinicja nie może dodawać, usuwać ani zmieniać nazw pól lub metod, zmieniać sygnatur metod ani zmieniać dziedziczenia.

Mam nadzieję, że to pomoże.

Referencje: Javadoc

+0

Przepraszamy, zapomniałem dodać to jest Android. Nie mam tej klasy do wykorzystania :( – SlowAndSteady