Java's reflection API to oczywiście bardzo potężne narzędzie, ale nie szczególnie obiektowe. Jakie są sytuacje, w których właściwe (i odwrotnie, niewłaściwe) jest używanie refleksji?Jakie są odpowiednie i nieodpowiednie zastosowania refleksji w Javie?
Odpowiedz
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.
Podoba mi się komentarz do interfejsów; Natknąłem się na kod, który ostatnio utrzymywałem, w moim przekonaniu. – Feanor
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 :).
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).
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
- 1. Jakie są typowe zastosowania UDP?
- 2. Jakie są praktyczne zastosowania XOR w algorytmach
- 3. Jakie są odpowiednie zastosowania tych różnych metod tworzenia obiektów w JavaScript
- 4. Jakie są zastosowania podprogramów lwartości w Perlu?
- 5. Jakie zadania są najbardziej odpowiednie dla F #?
- 6. Jakie obiekty są odpowiednie dla Add-Member?
- 7. Jakie są zastosowania właściwości Wyrównaj i Zakotwiczenia w TForm?
- 8. Jakie są praktyczne zastosowania wzoru metody Factory?
- 9. Jakie są dozwolone zastosowania globalnych haków klawiatury?
- 10. Jakie są niektóre zastosowania metadanych Clojure?
- 11. Jakie są dobre zastosowania modułów pakowanych OCaml?
- 12. Jakie są zastosowania programów Mcrt1.o i Scrt1.o?
- 13. Jakie są różne techniki zapamiętywania w Javie?
- 14. Jakie są odpowiednie klawisze klawiatury do działań Google Glass touchpad?
- 15. Jakie są odpowiednie formaty właściwości http://schema.org/GeoShape?
- 16. Co to są próbki cieni w OpenGL i jakie są możliwe zastosowania dla nich?
- 17. Jakie są zastosowania If-None-Match z wieloma podmiotami?
- 18. Jakie są praktyczne zastosowania algorytmów najniższego wspólnego przodka?
- 19. Jakie operacje w Javie są uważane za atomowe?
- 20. Unikanie @ własności-itis (tj. Nadużywanie właściwości, jeśli są one odpowiednie)?
- 21. mechanizmy Java na zastosowania w zamknięciach lambdaj
- 22. Jakie są zastosowania dla^i jak mogę uzyskać więcej informacji na ten temat?
- 23. Jakie zastosowania mają atrybuty parametrów ogólnych?
- 24. Jak określić odpowiednie rozszerzenie pliku z typu MIME w Javie
- 25. Czy rozmiar ikon i rozdzielczość ikony Apple Watch są odpowiednie?
- 26. Jakie są różne sposoby, w jakie "to" może uciec w Javie?
- 27. Jakie są korzyści z curry?
- 28. Jakie są odpowiednie ustawienia dla ZMQ podczas wysyłania 500-bajtowych 64-bajtowych wiadomości?
- 29. Czy websockets są odpowiednie do użycia z PHP?
- 30. Jakie są odpowiednie zalety/ograniczenia Amazon RDS vs. EC2 z MySQL?
Fajnie pisać, ból kłopoty pędu i utrzymać – Kennet
Jak każdy API, użyj go, kiedy trzeba. – Kwebble