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.