curs2_java.pdf

16
Curs 2 Convesii de tip. Virtualizarea Structura alocarii memoriei Ciclul de viata al unei clase Colectarea Garbage Collector (exemplu) Metodele clasei Object Clonarea Exceptii JNI (exemplu)

Upload: ancutzica891855

Post on 14-Sep-2015

215 views

Category:

Documents


0 download

TRANSCRIPT

  • Curs 2

    Convesii de tip. Virtualizarea

    Structura alocarii memoriei

    Ciclul de viata al unei clase

    Colectarea

    Garbage Collector (exemplu)

    Metodele clasei Object

    Clonarea

    Exceptii

    JNI (exemplu)

  • Structura alocrii memoriei

  • Ciclul de viata al unei clase

    Se refera la existenta clasei in memorie

    Incarcare Load - Incarcarea codului de octeti al clasei (byte code)

    Legare Link

    Verificare Verify - Verificarea codului de octeti

    Alocare Prepare - Alocarea spatiului de memorie pentru clasa in Memory Area

    Rezolvarea referintelor simbolice din Constant Pool Resolve Transformarea referintelor simbolice in referinte de memorie

    Initializare Initialize - Initializarea variabilelor statice si executarea blocurilor statice de initializare

    Instantiere Instantiation - Instantierea obiectelor

    Eliberarea spatiului ocupat de obiecte Collection

    Finalizarea obiectelor - Finalize

    Eliberarea spatiului ocupat de clasa - Unload

  • Colectarea

    Mecanism prin care JVM (Java Virtual Machine) isi realizeaza managementulmemoriei

    Lansarea voluntara a colectarii se poate realiza prin metodele statice ale clasei utilitare System:

    public static void gc(); // Lansarea voluntara a GC in incercarea de finalizare atuturor obiectelor fara referinta

    public static void runFinalization(); // lansarea metodei finalize() pt. obiectelefinalizate pentru care nu s-a rulat finalize(). Reda controlul apelatorului dupafinalizare

  • Clasa Object

    protected Object clone() throws CloneNotSupportedException; // returneazao 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. Implementareaimplicita pentru Object: intoarce true daca obiectul current este acelasi cu obj.

    protected void finalize() throws Throwable ; // metoda invocata de colectorulde reziduuri la disponibilizarea obiectului

    public final Class getClass(); // furnizeaza instanta de tip Class asociataobiectului 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 concurential

    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 String toString() ; // 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. Conventiile 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 String getMessage() ; // 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 String toString() ; // intoarce mesajul de eroare si numele clasei

    public Throwable getCause(); // 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

    Obiectele clonabile trebuie sa fie instante ale unor clase care implementeaza

    interfata Cloneable;

    protected Object clone() 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

    #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)

  • Tipuri de date si maparea tipurilor

    Tip Java Tip JNI Descriere

    boolean jboolean 8 bits, unsigned

    byte jbyte 8 bits, signed

    char jchar 16 bits, unsigned

    double jdouble 64 bits

    float jfloat 32 bits

    int jint 32 bits, signed

    long jlong 64 bits, signed

    short jshort 16 bits, signed

    void void N/A

  • Identificatori de tipuri

    Tip Java Signature

    boolean Z

    byte B

    char C

    double D

    float F

    int I

    long J

    void V

    object Lnume_calificat_clasa;

    tip[] [tip

    metoda ( tip_argumente) tip_returnat

  • Identificatorii de simboluri

    Metoda Semnatura

    void f1() ()V

    int f2(int, long) (IJ)I

    boolean f3(int[]) ([I)B

    double f4(String, int) (Ljava/lang/String;I)D

    void f5(int, String [], char) (I[Ljava/lang/String;C)V

  • 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:

    tip nume = 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, myMethod);