[ Pobierz całość w formacie PDF ]
obiektu, natomiast zmieniają się referencje do pól w nim.
Znacznie ciekawszym problemem jest wywoływanie metod z obiektów tworzonych
refleksyjnie. W dalszej części tego paragrafu pokażę, jak wywołać metodę add klasy
z listingu 2.84.
Listing 2.84. Definicja klasy testowej z metodą
public class Testm {
public int add(int a, int b) {
return (a + b);
}
}
94 Java. Programowanie obiektowe
Na listingu 2.85 wykorzystam wiedzę o strukturze tej klasy (jednak bez dostępu do
definicji jej typu) do uruchomienia jej jedynej metody z użyciem obiektów refleksyjnych.
Listing 2.85. Refleksyjne użycie klasy testowej z metodą
// egzemplarz klasy nadzorującej
Class cls = Class.forName("Testm");
// egzemplarz obiektu refleksyjnego
Object obj = Class.forName("Testm").newInstance();
// nadzorcy parametrów
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
// nadzorca metody
Method meth = cls.getMethod("add", partypes);
// egzemplarze parametrów
Object arglist[] = new Object[2];
arglist[0] = new Integer(11);
arglist[1] = new Integer(22);
// wywołanie metody
Object retobj = meth.invoke(obj, arglist);
// odbiór wyniku
Integer retval = (Integer)retobj;
System.err.println(retval.intValue());
Jak widać, technika jest podobna do stosowanej w przypadku obsługi pól, chociaż
oczywiście jest nieco bardziej skomplikowana ze względu na konieczność dodatko-
wej obsługi parametrów wywoływanych funkcji. Zaprezentowany przykład korzystał
z wiedzy na temat struktury używanej metody (parametrów i wyniku). W praktyce
powyższy przykład powinien być rozszerzony o badanie tych elementów i obsługę
ewentualnych błędów. Można na przykład stworzyć z użyciem tej metody zaawan-
sowany kalkulator, w którym użytkownik końcowy mógłby dodawać swoje funkcje
automatycznie rozpoznawane na podstawie nazwy.
2.6.4. Związek refleksji z obiektowością
Możliwości refleksji nie rozszerzają w żaden istotny sposób idei programowania
obiektowego. Z punktu widzenia tej idei jedyną, acz wątpliwą zaletą jest możliwość
dogłębnego sprawdzenia struktury klasy, której nie jesteśmy autorami. Jednak jeśli
klasa została dobrze zaprojektowana, to analiza taka nie powinna nam przynieść żad-
nych dodatkowych korzyści. Wszak hermetyzację i ukrywanie niektórych cech im-
plementacyjnych wprowadzono po to, by nie zaciemniać programu niepotrzebnymi
szczegółami, których znajomość nie wnosi żadnej nowej wiedzy do procesu działania
tego obiektu.
Stosując refleksje, należy pamiętać o różnicy między egzemplarzem klasy nadzorują-
cej refleksje, a samym egzemplarzem obiektu refleksyjnego. Jeśli nie nastąpi pomie-
szanie obu pojęć, to nie powinno być problemów z właściwym stosowaniem tej cie-
kawej cechy Javy udostępnianej przez jej bibliotekę.
Rozdział 2. f& Klasy i obiekty w Javie 95
2.7. Metody
Metody to połączone w jedną całość zbiory instrukcji, które umożliwiają wykonywa-
nie akcji charakterystycznych dla danego obiektu bądz zmieniają jego stan. Przy opi-
sywaniu sposobów tworzenia klas wprowadziłem informacje dotyczące używania
metod jako całości, nie wgłębiając się w szczegółowe zasady działania rządzące ich
tworzeniem. Teraz zajmę się kwestiami związanymi z wewnętrzną strukturą metod
i sposobem porozumiewania się kodu wewnętrznego metody z kodem, który ją wy-
wołuje. Większość pokazanych tu kwestii dotyczy również konstruktorów, które nie-
mal nie różnią się w swojej budowie od metod.
Metody to kolejny element układanki składającej się na obiektowy sposób progra-
mowania. Pozwalają ukrywać bardziej rozbudowane operacje pod nazwą metody.
Bardzo podobne znaczenie mają funkcje i procedury w zwykłym programowaniu
strukturalnym. Jednak cechą metod jest to, że mogą działać na danych należących do
obiektu, czyli do konkretnego egzemplarza klasy. Jeśli w zwykłym programowaniu
strukturalnym funkcja odwołuje się do pewnej zmiennej zadeklarowanej poza jej cia-
łem, to zawsze odwołuje się do tej samej zmiennej (do jednego jej egzemplarza).
W programowaniu obiektowym jest inaczej. Tworząc egzemplarze klas, tworzymy
zestawy danych związanych z pewną metodą. Możemy tworzyć więcej takich samych
egzemplarzy i wywołanie metod wiązać z konkretnymi zestawami danych, czyli obiek-
tami. Dzięki temu metoda może działać za każdym razem na danych zewnętrznych,
ale przechowywanych specjalnie na potrzeby tej i innych metod tego obiektu. Kolej-
[ Pobierz całość w formacie PDF ]