Programowanie obiektowe

Podobne dokumenty
Programowanie obiektowe

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie obiektowe

Wykład 04. Programowanie obiektowe. Maciej Wołoszyn 17 marca Spis treści

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Enkapsulacja, dziedziczenie, polimorfizm

Wykład 8: Obsługa Wyjątków

Dziedziczenie. dr Jarosław Skaruz

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie Obiektowe Ćwiczenie 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

Dokumentacja do API Javy.

Programowane refleksyjne i serializacja

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie obiektowe

Programowanie obiektowe

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Multimedia JAVA. Historia

Dawid Gierszewski Adam Hanasko

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Technologie i usługi internetowe cz. 2

Polimorfizm. dr Jarosław Skaruz

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Wywoływanie metod zdalnych

PHP 5 język obiektowy

Programowanie obiektowe


Aplikacje w środowisku Java

Programowanie w języku Java WYKŁAD

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Aplikacje w środowisku Java

Programowanie obiektowe

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Przypomnienie o klasach i obiektach

TEMAT : KLASY DZIEDZICZENIE

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Java Język programowania

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Aplikacje w środowisku Java

Java SE Laboratorium nr 4. Temat: Obsługa wyjątków i zdarzeń

Podstawy i języki programowania

Platformy Programistyczne Podstawy języka Java

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Klasy abstrakcyjne, interfejsy i polimorfizm

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wywoływanie metod zdalnych

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wyjątki (exceptions)

Diagramy klas. dr Jarosław Skaruz

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Java: interfejsy i klasy wewnętrzne

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Klasy i obiekty cz II

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 4: Klasy i Metody

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy Języka Java

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Zaawansowane techniki programowania C#

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Kompozycja i dziedziczenie klas

Programowanie obiektowe

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Programowanie obiektowe

Programowanie obiektowe

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe i język Java

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

Podstawy i języki programowania

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Remote Method Invocation 17 listopada 2010

Rozdział 4 KLASY, OBIEKTY, METODY

Transkrypt:

Programowanie obiektowe III. Refleksja Małgorzata Prolejko OBI JA16Z03

Plan Klasa Class. Analiza funkcjonalności klasy. Podstawy obsługi wyjątków. Zastosowanie refleksji do analizy obiektów. Wywoływanie dowolnych metod.

Refleksja Refleksja/odbicie to sposób programowania, w którym kod wykonywalny zależny jest od stanu programu. W trakcie wykonywania programu analizowane są nazwy zmiennych i funkcji, a algorytmy dostosowane są do różnych typów danych. Dzięki refleksji można tworzyć nowe schematy zachowania języka, operować na kodzie tak jak na danych, bądź korzystać z klas nieznanych w trakcie tworzenia programu. Refleksja służy np. diagnostyce, obsłudze wyjątków, dynamicznemu rozszerzaniu możliwości programu. http://docs.oracle.com/javase/tutorial/reflect/

Refleksja Reflaksja korzysta ze specjalnych klas z pakietu java.lang.reflect.*: Class przechowuje informacje o klasie i jej strukturze AccessibleObject klasa dostępowa do struktury klasy, nadklasa dla Field przechowuje informacje o polach klasy Method przechowuje informacje o metodach klasy Constructor przechowuje informacje o konstruktorach Modifier klasa dostarczająca statycznych metod odczytywania informacji o polach i metodach Proxy klasa dostarczająca statycznych metod tworzenia klas proxy oraz klasa bazowa dla wszystkich dynamicznych klas proxy.

Klasa Przechowywanie informacji o typie danego obiektu (a nie o jego stanie) ma miejsce w obiektach klasy Class. Czytelnik c = new Czytelnik(); Class kl = c.getclass(); przechowuje obiekt i informacje o obiekcie System.out.println(kl.getName()); //Czytelnik przechowuje informacje o typie obiektu Informacje o typie można pobrać znając nazwę klasy docelowej, Class kl = Class.forName("Czytelnik"); lub skrótowo (co działą też dla typów prostych). Class kl = Czytelnik.class; package test25

Analiza funkcjonalności klasy Dzięki klasie Class można tworzyć obiekty różnych klas podanych przez nazwę wykorzystując konstruktor bezargumentowy. Object o = Class.forName("Czytelnik").newInstance(); Można także wykonać rzutowanie: (mimo, że w tym kontekście niezbyt użyteczne) Class.forName("Czytelnik").cast(o); Class jest typem sparametryzowanym. Można zatem ograniczać typ, żeby lepiej korzystać z metod. Class<? extends Czytelnik> cl = c.getclass(); cl.cast(o).getnumer(); package test25

Zastosowanie refleksji do analizy obiektów Pakiet java.lang.reflect zawiera narzędzia do badania stanu programu w trakcie jego wykonywania. Dzięki niemu można pisać kod uniwersalny. W analizie możliwości klas wykorzystywane są trzy klasy z tego pakietu: Constructor opisuje konstruktory Field opisuje pola Method opisuje metody Klasa Class posiada metody getconstructors, getfields, getmethods zwracające tablice publicznych elementów oraz getdeclaredconstructors, getdeclaredfields, getdeclaredmethods zawierające tablice wszystkich elementów (z pominięciem dziedziczonych z nadklasy).

Zastosowanie refleksji do analizy obiektów Constructor, Field i Method posiadają metody: String getname() zwraca nazwę int getmodifiers() zwraca lista modyfikatorów dostępu zakodorana binarnie w formie inta Constructor i Method mają: Class[] getparametertypes() zwraca listę parametrów Method: Class getreturntype() zwraca typ zwracany danej metody Field: Class gettype() zwraca typ danego pola

Zastosowanie refleksji do analizy obiektów Drukowanie listy pól klasy Czytelnik: String nazwaklasy = "Czytelnik"; try{ Class klasa = Class.forName(nazwaKlasy); Field[] pola = klasa.getdeclaredfields(); for(int i=0; i<pola.length; i++){ Field f = pola[i]; Class typ = f.gettype(); String nazwa = f.getname(); String modyfikatory = Modifiers.toString(f.getModifiers()); System.out.println(modyfikatory+" "+typ+" "+nazwa+"\n"); catch(classnotfoundexception e){e.printstacktrace(); Package test27

Wywoływanie dowolnych metod Dzięki mechanizmowi refleksji możliwe jest wywoływanie dowolnych metod po nazwie. String nazwaklasy = "Czytelnik"; String nazwametody = "getnumerkarty"; try{ Class klasa = Class.forName(nazwaKlasy); Method metoda = klasa.getmethod(nazwametody); String s = (String) metoda.invoke(klasa.newinstance()); System.out.println(s); catch(classnotfoundexception... e){e.printstacktrace(); Package test28

Podstawy obsługi wyjątków Wyjątki są obiektami klasy Exception zwracanymi przez metody gdy następuje problem z wykonaniem pewnych poleceń. Wyjątki należy obsłużyć, aby nie przerywać działania programu. Polecenia które mogą zwracać wyjątki należy umieścić w bloku try/catch, aby je obsłużyć. try{ //polecenia zwracające wyjątki catch(exception e){ //obsługa wyjątku e Gdy w bloku try zostanie zwrócony wyjątek sterowanie przenosi się natychmiast do bloku catch. Package test25, test26

Podstawy obsługi wyjątków Wyjątki powinny zostać obsłużone najszybciej jak to jest możliwe. Wyświetlenie informacji na konsoli w wielu przypadkach nie jest wystarczające, ponieważ fragment kodu nie został wykonany. W bloku catch w najlepszym wypadku powinien się znajdować kod alternatywny, który korzysta z wiedzy, że dany wyjątek poleciał. Jeżeli wyjątek nie może zostać dobrze obsłużony należy zlecić jego obsługę metodzie wywołującej daną. Robi się to przekazując w deklaracji metody słowo kluczowe throws oraz listę wyjątków jakie powinny zostać obsłużone wyżej. public void jakasmetoda(lista argumentow) throws Wyjatek1, Wyjatek2 {...

Wyjątki przepływ sterowania Niech będzie dany kod, w którym linia 1 może zwrócić Wyjątek1 lub Wyjątek3, a linia 2 może zwrócić Wyjątek2. public throws Wyjatek3 linia 0 Jeżeli żaden wyjątek się nie pojawi, to kolejność wykonywania kodu wygląda następująco: try{ linia 1 linia 2 Linia 0 catch(wyjątek1 w1){ obsługa w1 catch(wyjątek2 w2){ obsługa w2 Linia 1 Linia 2 Linia 3 linia 3

Wyjątki przepływ sterowania Niech będzie dany kod, w którym linia 1 może zwrócić Wyjątek1 lub Wyjątek3, a linia 2 może zwrócić Wyjątek2. public throws Wyjatek3 linia 0 try{ linia 1 linia 2 Jeżeli Wyjątek1 zwróci linia 1, nie zostanie wykonana dana metoda i obsługa przejdzie do pierwszego bloku catch po czym wróci do linii 3. Linia 0 Linia 0 catch(wyjątek1 w1){ obsługa w1 Linia 1 Linia 2 Linia 1 Obsługa w1 catch(wyjątek2 w2){ obsługa w2 Linia 3 Linia 3 linia 3

Wyjątki przepływ sterowania Niech będzie dany kod, w którym linia 1 może zwrócić Wyjątek1 lub Wyjątek3, a linia 2 może zwrócić Wyjątek2. public throws Wyjatek3 linia 0 try{ linia 1 linia 2 Jeżeli Wyjątek2 zwróci linia 2, nie zostanie wykonana dana metoda i obsługa przejdzie do drugiego bloku catch po czym wróci do linii 3. Linia 0 Linia 0 catch(wyjątek1 w1){ obsługa w1 Linia 1 Linia 2 Linia 1 Linia 2 Obsługa w2 catch(wyjątek2 w2){ obsługa w2 Linia 3 Linia 3 linia 3

Wyjątki przepływ sterowania Niech będzie dany kod, w którym linia 1 może zwrócić Wyjątek1 lub Wyjątek3, a linia 2 może zwrócić Wyjątek2. public throws Wyjatek3 linia 0 try{ linia 1 linia 2 Jeżeli linia 1 zwróci Wyjątek3 nie zostanie wykonana dana metoda oraz reszta kodu tej metody, a obsługa programu przejdzie do metody nadrzędnej, gdzie Wyjątek3 powinien zostać obsłużony. Linia 0 Linia 0 catch(wyjątek1 w1){ obsługa w1 Linia 1 Linia 2 Linia 1 Wyjątek3 catch(wyjątek2 w2){ obsługa w2 Linia 3 linia 3

Wyjątki klauzula finally Czasem koniecznym jest wykonanie pewnych operacji bez względu na to jaki wyjątek oraz czy w ogóle jakiś został wygenerowany. Kod taki, np. zwalniający zasoby, zamykający strumienie danych, pisze się w klauzuli finally. try{ //polecenia zwracające wyjątki catch(exception e){ //obsługa wyjątku e finally{ //kod który zawsze zostanie wykonany

Wyjątki klauzula finally public throws Wyjatek3 linia 0 Przepływ bez wyjątków Linia 0 try{ linia 1 linia 2 Linia 1 Linia 2 catch(wyjątek1 w1 Wyjątek2 w2){ obsługa w1 lub w2 finally{ blok finally linia 3 blok finally Linia 3

Wyjątki klauzula finally public throws Wyjatek3 Obsłużony Wyjątek1 w linii 1 linia 0 Linia 0 Linia 0 try{ linia 1 linia 2 Linia 1 Linia 2 Linia 1 Obsługa w1 catch(wyjątek1 w1 Wyjątek2 w2){ obsługa w1 lub w2 finally{ blok finally linia 3 blok finally Linia 3 blok finally Linia 3

Wyjątki klauzula finally public throws Wyjatek3 Nieobsłużony Wyjątek3 w linii 1 linia 0 Linia 0 Linia 0 try{ linia 1 linia 2 Linia 1 Linia 2 Linia 1 Wyjątek3 catch(wyjątek1 w1 Wyjątek2 w2){ obsługa w1 lub w2 finally{ blok finally linia 3 blok finally Linia 3 blok finally

Własne wyjątki Można samemu napisać klasę wyjątku odpowiednią do danych i działania programu. Następnie takie wyjątki w kodzie się wywołuje. public class BrakKsiazkiException extends Exception { public BrakKsiazkiException(){ public BrakKsiazkiException(String info){ super(info); klasa wyjątku musi dziedziczyć po Exception public class LimitPrzekroczonyException extends Exception { public LimitPrzekroczonyException(){ super("przekroczono limit wypożyczeń"); public LimitPrzekroczonyException(String info){ super(info); Package test29 Konstruktor bezargumentowy lub z informacją o błędzie go której będzie można dotrzeć za pomocą.getmessage() Wywołanie konstruktora klasy bazowej

Własne wyjątki Można samemu napisać klasę wyjątku odpowiednią do danych i działania programu. Następnie takie wyjątki w kodzie się wywołuje. public class Ksiazka { private String tytul; private boolean napolce = true; public Ksiazka(String t){tytul = t; public String gettytul(){return tytul; public boolean isnapolce(){return napolce; public void setnapolce(boolean b){napolce = b; klasa Książka posiada pole dzięki któremu widać czy na półce dana książka jest dostępna Package test29

Własne wyjątki public class Czytelnik { private static final int MAX_WYPOZYCZEN = 2; private ArrayList<Ksiazka> listaksiazek;... lista wyjątków wyrzucanych przez metodę public void wypozycz(ksiazka k) throws LimitPrzekroczonyException, BrakKsiazkiException { if (!k.isnapolce()) throw new BrakKsiazkiException( Nie ma "+ k.gettytul()); else if (listaksiazek.size() == MAX_WYPOZYCZEN) throw new LimitPrzekroczonyException(); else { k.setnapolce(false); listaksiazek.add(k); wywołanie wyjątku Package test29

Własne wyjątki Ksiazka k = new Ksiazka("Ksiazka 1"); Czytelnik c = new Czytelnik(); metoda zwracająca wyjątki otoczona klauzulą try/catch try { System.out.println( "Czytelnik nr." + c.getnumer() + " chce wypożyczyć " + k.gettytul()); c.wypozycz(k); System.out.println("-Udało się!"); catch (LimitPrzekroczonyException e) { System.out.println("-Nie udało się ponieważ " + e.getmessage()); catch (BrakKsiazkiException e) { System.out.println("-Nie udało się ponieważ " + e.getmessage()); e.printstacktrace() działa asynchronicznie i komunikat nie musi zostać umieszczony w potoku wiadomości System.out Wyświetlenie informacji o wyjątku Package test29