Sunteți pe pagina 1din 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)

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 managementul
memoriei
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 a
tuturor obiectelor fara referinta

public static void runFinalization(); // lansarea metodei finalize() pt. obiectele


finalizate pentru care nu s-a rulat finalize(). Reda controlul apelatorului dupa
finalizare

Clasa Object

protected Object clone() 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 Class getClass(); // 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 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 <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)

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

byte

char

double

float

int

long

void

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