Programowanie refleksyjne

Transkrypt

Programowanie refleksyjne
Justyna Korycińska
Programowanie refleksyjne polega na dynamicznym
korzystaniu ze struktur języka programowania, które
nie musiały być zdeterminowane w momencie
tworzenia oprogramowania.
 Class
 Field
 Method
 Array
 Constructor
Powyższe klasy zgrupowane są w pakietach java.lang i
java.lang.reflect
Wszystkie klasy tworzone w Javie mogą być używane
zarówno w sposób tradycyjny jak i refleksyjny.
Oczywiście klasa nie może być prywatna, gdyż wtedy
nie będzie mogła być skompilowana jako główna klasa
pliku Java.
 // bez refleksji
Foo foo = new Foo();
foo.hello();
 // z refleksją
Class cl = Class.forName("Foo");
Method method = cl.getMethod("hello");
method.invoke(cl.newInstance());
 Należy sprawdzić liczbę i typy parametrów oraz wynik.
Należy bardzo uważać na ewentualną możliwość
przeciążenia metod oraz konstruktorów.
 Ważną kwestią, która może uniemożliwić korzystanie
z obiektów refleksyjnych jest sposób tworzenia tych
obiektów. Do tego celu nadzorca obiektu refleksyjnego
wykorzystuje konstruktor bezparametrowy. Jeśli klasa
wymaga tworzenia z użyciem innego konstruktora, to
mogą pojawić się trudności z jej poprawnym użyciem.
 Kolejną kwestią jest obsługa błędów. Powinna ona być
na znacznie wyższym poziomie, niż w przypadku
zwykłych obiektów. Poza obsługą standardowych
przypadków, które mogą zajść w czasie normalnej
pracy powinna ona uwzględnić kwestie związane z
dynamicznym dostępem do samego obiektu jak i jego
składowych.
Wszystkie te utrudnienia powodują, że obiekty
refleksyjne powinny być używane tylko wtedy, gdy jest
to naprawdę potrzebne.
 W językach programowania zorientowanych
obiektowo, refleksji używa się do przeprowadzania
inspekcji w klasach, interfejsach lub metodach.
Można to zrobić w trakcie działania programu i nie
musimy znać ich nazw.
 Refleksja może być dynamicznie zaadaptowana do
różnych sytuacji w zależności od tego co
potrzebujemy,
 Przykładowo aplikacja używa dwóch różnych klas X i Y
zamiennie do wykonywania podobnych czynności. Bez
refleksji, aplikacja może wymagać wiele kodu, by
wywołać metody klasy X i Y. Jednak przy użyciu
refleksji, aplikacja może wykorzystać odbicie w celu
wywołania metod w klasach X i Y.