170 likes | 369 Views
Curs 2. Simularea transmiterii functiilor ca parametrii. Delegate Blocuri de inițializare Declararea masivelor Clase Immutable. String Clasele wrapper StringBuilder , StringBuffer Metodele clasei Object Clonarea Exceptii JNI Clase Generice JCF (Java Collection Framework).
E N D
Curs 2 Simularea transmiterii functiilor ca parametrii. Delegate Blocuri de inițializare Declarareamasivelor Clase Immutable. String Clasele wrapper StringBuilder, StringBuffer Metodeleclasei Object Clonarea Exceptii JNI ClaseGenerice JCF (Java Collection Framework)
Clasa Object • protected Objectclone() throws CloneNotSupportedException; // returneaza o clona a obiectului curent • public boolean equals(Object obj); // arata daca obiectul current este egal cu cel specificat. Pentru un obiect non-null metoda are proprietatile: reflexivitate, simetrie, tranzitivitate, consistenta si non-egalitate cu null. Implementarea implicita pentru Object: intoarce true daca obiectul current este acelasi cu obj. • protected void finalize() throws Throwable; // metoda invocata de colectorul de reziduuri la disponibilizarea obiectului • public final ClassgetClass(); // furnizeaza instanta de tip Class asociata obiectului curent • public final void notify() ; // scoate din starea de asteptare un fir introdus in asteptare prin obiectul monitor curent (programare concurenta) • public final void notifyAll() ; // idem pentru toate firele • public final void wait() throws InterruptedException ; // trecere in stare de asteptare a firului curent. Metoda este invocata intr-un context concurent • public final void wait(long timeout) throws InterruptedException ; //idem dar se specifica o cuanta de timp exprimata ia milisecunde pentru starea de asteptare • public final void wait(long timeout, int nanos) throws InterruptedException; //idem
public StringtoString() ; // descriere de tip string a obiectului curent Descrierea implicita este: getClass().getName() + '@' + Integer.toHexString(hashCode()) • public int hashCode() ; // Intoarce un cod hash asociat obiectului, cod care sa poata fi utilizat in tabele de dispersie. Regulile de generare a codului hash sunt: • codul unui obiect nu se schimba pe parcursul unei executii • doua obiecte egale in sensul metodei equals, au coduri egale • doua obiecte inegale conform equals nu trebuie sa aiba neaparat coduri distincte Pentru a respecta aceste regului este necesara suprascrierea metodei hashCode atunci cand se suprascrie metoda equals.
Tratarea exceptiilor Erorile se impart in doua tipuri: checked si unchecked dupa cum tratarea lor este obligatorie sau nu (adica trebuie mentionate in clauzele throws ale metodelor/constructorilor si trecute prin blocul try-catch). Ierarhia: Throwable - Superclasa tuturor claselor de erori Error - Erori grave de tip unchecked cauzate de regula de mediu Exception - Exceptii corespunzand unor erori obisnuite de tip checked mai putin cele de tip RuntimeException care sunt de tip unchecked si aruncate de JVM Metode ale clasei Throwable: public StringgetMessage() ; // intoarce mesajul de tip String asociat erorii public StackTraceElement[] getStackTrace(); // intoarce elementele din stiva de executie reprezentand metode aflate in executie la momentul aruncarii exceptiei public StringtoString() ; // intoarce mesajul de eroare si numele clasei public ThrowablegetCause(); // intoarce cauza care a generat eroarea atunci cand eroarea a fost provocata de alta. Instantierea obiectului Throwable trebuie sa se fi facut printr-un constructor care sa primeasca si referinta la eroarea cauza.
try{ // secventa } catch(ClasaExceptii1 e1){secventa1} ... catch(ClasaExceptiiN eN){secventaN} finally{secventaFinal}
Clonarea obiectelor protected Objectclone() throws CloneNotSupportedException public Object clone(){ try { return super.clone(); } catch(CloneNotSupportedException e){ System.out.println("Eroare la clonare!"+e); return this; } }
Java Native Interface Este o interfata Java pentru cod nativ. Avantaje: reutilizare de cod, performante imbunatatite ca timp de executie. Este dezvoltata pentru utilizare cod C++ si C. Etapele construirii unei aplicatii JNI: 1. Scrierea clasei Java care utilizeaza metode native 2. Construirea fisierului header C++ sau C in care sunt descrise functiile prototip corespunzatoare metodelor native. Se foloseste utilitarul javah: javah numeFisierClass Functia prototip va fi: JNIEXPORT tip JNICALL Java_numeClasa_metoda(JNIEnv *env, jobject obj, listaParametrii); unde: tip - tipul functiei; numeClasa - este numele calificat al clasei; metoda - numele metodei; listaParametrii - lista parametriilor metodei native
env - referinta la mediul JNI prin care se asigura accesul la functiile JNI obj - referinta la obiectul Java JNIEXPORT, JNICALL - macrouri utilizate pentru conformitatea codului C++ (conventii de apel, parametrizari pentru compilarea si linkedidarea codului C++) 3. Implementarea functiilor C++/C si construirea bibliotecii cu incarcare dinamica dll. #include <jni.h> #include "numeFisierPrototip.h" JNIEXPORT tip JNICALL Java_numeClasa_metoda(JNIEnv *env, jobject obj, listaParametrii) { .... [return;] } 4. Incarcarea bibliotecii dinamice in aplicatia Java si rularea aplicatiei. System.loadLibrary(numeDll)
Accesarea campurilor clasei in functiile C++ Accesarea campurilor si metodelor clasei se face prin mediul JNI. Accesarea campurilor presupune: - Obtinere referinta la clasa: jclass thisClass = env->GetObjectClass(obj); - Obtinerea identificatorului de camp: jfieldID fidField = env->GetFieldID(thisClass, "numeCamp", "IdentificatorDeTip"); - Obtinerea valorii campului: tipnume = env->GetTipField(obj, fidField);
Accesarea metodelor clasei in functiile C++ Accesarea metodelor presupune: - Obtinere referinta la clasa: jclass thisClass = env->GetObjectClass(obj); - Obtinerea identificatorului de metoda: jmethodID myMethod = env->GetMethodID(thisClass, "numeMetoda", "IdentificatorDeMetoda"); - Invocarea metodei: env->CallTipMethod(obj, mmyMethod);
Clase generice - Generics • Java Generics este o tehnologie Java prin care a fostintrodus in Java (odata cu distributia 1.5) conceptul de clasegenerice • Conceptulesteasemănător celui de "template" din C++ • Diferentafundamentala: • C++ : expandare la compilarepentrufiecare tip • Java: “eradicarea” tipului la compilare – castulcatretipul de baza, faraexpandareacodului Declaratia de clasa: [public] class NumeClasa<T1, T2, ..., TN> { ... } Metodegenerice: [public/protected/private] [static] <T1, T2, ..., TN> tipnumeMetoda(listaParametrii) [throws E1,...,E2] {...}
Colectii proprii public interface Iterable<T> • Iterator<T> iterator() public interface Iterator<E> • boolean hasNext() • E next() • void remove()
Operatorul wildcard Este utilizat pentru a flexibiliza utilizarea listelor generice, astfel: • <?> • semnifica tip necunoscut • este utilizat cand nu se cunoaste sau nu are importanță tipul de bază • <? extends Tip> • ține locul unui tip de bază (upper-bounded wildcard) • <? super Tip> • ține locul unui tip derivat (Lower-bounded wildcard)