2010-07-24 12 views

Odpowiedz

3

Moim zdaniem ...

odpowiednie (czyste):

  • instancji korzeń dynamicznie załadowanego realizacji, takich jak aplet.
  • Użycie Proxy do utworzenia proxy lub fałszywej implementacji (może być lepiej w czasie kompilacji).
  • Implementacja interpreterów umożliwiających nieograniczony dostęp do bibliotek Java. (Uwaga, z punktu widzenia bezpieczeństwa interpretowany kod ma teraz efektywne uprawnienia, jak tłumacza - może być trochę niebezpieczne.)

Odpowiednie hacki:

  • obejście Java kontroli dostępu język w kodzie strony trzeciej gdzie absolutnie musisz.
  • Wdrażanie "problemu przekrojowego", takiego jak trwałość.
  • Usuwanie zależności statycznych, które ładują klasy powodujące wolniejsze uruchamianie.

Nieodpowiednie:

  • ogólne kontrole dostępu obejście język Java (obejmuje testowanie).
  • Wszystko, co jest zależne od praw dostępu do języka Java, podanych przez konkretną klasę wywoływania odbić.
  • Wszędzie tam, gdzie mógłby działać interfejs.

Ogólnie rzecz biorąc odbicie jest o wiele łatwiejsze niż generowanie źródła, co jest znacznie łatwiejsze niż tworzenie kodu bajtowego.

+0

Podoba mi się komentarz do interfejsów; Natknąłem się na kod, który ostatnio utrzymywałem, w moim przekonaniu. – Feanor

2

Proponuję rzucić okiem na książkę: Java Reflection in Action.

Jest bardzo dobry, jest szczegółowy i praktycznie stanowi kompletne odniesienie do tej zaawansowanej koncepcji.

Jest to znacznie więcej niż możemy wyjaśnić tutaj, ze scenariuszami, zwyczajami i pojęciami, które pojaśnią się po przeczytaniu :).

1

Podobnie jak w przypadku każdej technologii, częstym celem powinna być kierowca w określaniu, które zastosowanie jest właściwe. Nie "wzory", blokujące zdolności myślenia mózgu.

Nie myśl o refleksji jako o "technologii". Jest to po prostu obiekt metadanych powiązany z dowolnym typem danych i dostępny w środowisku wykonawczym. Prosty obiekt, zaimplementowany w optymalny możliwy sposób (pomyśl tylko, jak go zaimplementować i najprawdopodobniej zgadniesz rzeczywistą implementację).

Z prostych względów oczywiste jest, że wszystkie metody klasy/metody/pola typu get-coś-na-nazwę powodują wyszukiwanie mapy/indeksu za każdym razem, gdy są wywoływane, więc ta operacja jest w pewnym sensie warta zrobienia właśnie raz w życiu aplikacji. Ale gdy uzyskuje wydajność method.invoke (obiekt, args) jest prawie taka sama jak z obiekt.metoda (args), ponieważ wprowadza tylko jeden poziom zadnie, niewymagające żadnych dodatkowych wyszukiwań.

Przykłady gdzie chciałbym użyć refleksji podejścia opartego: właściwości

  • zainicjować/KOPIA/serializacji/print Bean wg nazwy, to zadanie pojawia się w większości zastosowań biznesowych i raz użyć dynamicznego programowania (czyli zrobić wyszukiwań nazw opartych tylko raz, aby zainicjować konwertery/ładowarki, a następnie zastosować ten sam przetwornik wzdłuż życia aplikacji) nie dodaje dużo napowietrznych ale dodaje exellent elastyczność oprogramowania (patrz Commons beanutils, wiosna iniekcji zależność).

  • transakcyjne/sesji/autoryzacji/dane/mock proxy (przy użyciu dynamicznego proxy API z JDK)

  • wygodną alternatywę do XSD eliminując parsera XML (przy użyciu WZP/JAXB/WS/JAXB i wszelkie inne adnotacje), aby zachować uzupełniające informacje o tym, jak obiekt powinien się utrzymywać, co GUI etykiety będą wyświetlane dla każdego pola, itp (patrz JAX-WS, hibernacja)

nie mogę wymyślić przykład, w którym używam woudn't refleks, po prostu nie używaj go tam, gdzie rozwiązanie oparte na metadanych nie jest optymalne (od samego analizowania, czym jest obiekt metadanych).

0

used to do czasu proste bitów kodu niezmienionej przypisanie CS. Były trzy liczby pierwsze znalezienia programów, dla których mielibyśmy porównać okresie czasu 10 równomiernie rozmieszczonych sufitów z 1E5-1E6. Ponieważ wszyscy wzięli Wejście W ten sam sposób (sufit \ n ze standardowego wejścia) można używać przekierowanie stdio je karmić „Klawiatura” wejście do sufitu i rowu wyjście i porównać okresie razy czysto. Oczywiście było to możliwe (bez modyfikowania kodu) za pomocą refleksji, aby wywołać główne metody. Niezmienione programy testowe nie były wymagane, ale pomyślałem, że będzie fajnie. Potem znalazłem ten wątek szuka r

Powiązane problemy