Sunteți pe pagina 1din 23

Clasa Object

• protected object clone() throws CloneNotSupportedException; // returneaza o clona a


obiectului curent
• public boolean equals(object obj); // arată dacă obiectul curent este egal cu cel specificat.
pentru un obiect non-null metoda are proprietățile: reflexivitate, simetrie, tranzitivitate,
consistenta si non-egalitate cu null. Implementarea implicită pentru Object: întoarce true
dacă obiectul curent este același cu obj.
• protected void finalize() throws Throwable ; // metodă invocată de colectorul de reziduuri la
disponibilizarea obiectului (Deprecated începând cu versiunea 9)
• public final class getclass(); // furnizează instanța de tip class asociata obiectului curent
• public final void notify() ; // scoate din starea de așteptare un fir introdus in așteptare prin
obiectul curent (programare concurentă)
• public final void notifyall() ; // idem pentru toate firele
• public final void wait() throws InterruptedException ; // trecere în stare de așteptare a firului
curent. Metoda este invocată într-un context concurențial de către obiectul curent.
• public final void wait(long timeout) throws InterruptedException; //idem dar se specifică o
cuantă de timp exprimată în milisecunde pentru starea de așteptare
• 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() ; // Întoarce un cod hash asociat obiectului, cod care să poată fi utilizat în
tabele de dispersie. Convențiile de generare a codului hash sunt:
 codul unui obiect nu se schimbă pe parcursul unei execuții
 două obiecte egale în sensul metodei equals, au coduri egale
 două obiecte inegale conform equals nu trebuie sa aibă neapărat coduri distincte
Pentru a respecta aceste reguli este necesară suprascrierea metodei hashCode atunci când se
suprascrie metoda equals.
Tratarea excepțiilor
Erorile se împart în două tipuri: checked si unchecked după cum tratarea lor este obligatorie sau nu (adică
trebuie menționate in clauzele throws ale metodelor/constructorilor și trecute prin blocul try-catch).
Ierarhia:
Throwable - Superclasa tuturor claselor de erori
Error - Erori grave de tip unchecked cauzate de regulă de mediul de execuție
Exception - Excepții corespunzând unor erori obișnuite de tip checked mai puțin cele de tip
RuntimeException care sunt de tip unchecked si sunt generate de JVM
Metode ale clasei Throwable

public String getMessage() ; // întoarce mesajul de tip String asociat erorii


public StackTraceElement[] getStackTrace(); // întoarce elementele din stiva de execuție
reprezentând metode aflate în execuție la momentul aruncării excepției
public String toString() ; // întoarce mesajul de eroare si numele clasei
public Throwable getCause(); // întoarce cauza care a generat eroarea atunci când eroarea a fost
provocată de o alta eroare.
try{
// secventa
}
catch(ClasaExceptii1 e1){secventa1}
...
catch(ClasaExceptiiN eN){secventaN}
finally{secventaFinal}

Exp (E_Exceptii)
Clonarea obiectelor
• Obiectele clonabile trebuie să fie instanțe ale unor clase care implementează interfața Cloneable;
protected Object clone() throws CloneNotSupportedException; // shallow copy

public Object clone() throws CloneNotSupportedException {


try {
return super.clone(); // shallow copy
// instantiere obiect nou - deep copy
}
catch(CloneNotSupportedException e){
System.out.println("Eroare la clonare!"+e);
return this;
}
}

Exp (E_Clonare)
Java Native Interface (JNI)
• Este o interfață Java pentru cod nativ.
• Avantaje: reutilizare de cod, performanțe îmbunătățite ca timp de execuție.
• Este dezvoltată pentru utilizare cod C++ si C.

Etapele construirii unei aplicatii JNI:


1. Scrierea clasei Java care utilizează metode native
2. Construirea fișierului header C++ sau C în care sunt descrise funcțiile prototip
corespunzătoare metodelor native. Se folosește utilitarul javah:
javah numeFisierClass
Funcția prototip va fi:
JNIEXPORT tip JNICALL Java_numeClasa_metoda(JNIEnv *env, jobject obj,
listaParametrii);
unde:
• tip - tipul funcției; numeClasa - este numele calificat al clasei; metoda - numele
metodei; listaParametrii - lista parametrilor metodei native
• JNIEnv este o structură care permite accesul la funcțiile JNI, un pointer la o tabelă de pointeri
către funcții JNI
• obj - referință la obiectul Java
• JNIEXPORT, JNICALL - macro-definiții utilizate pentru conformitatea codului C++ (convenții de apel,
parametrizări pentru compilarea si link-editarea codului C++)
3. Implementarea funcțiilor C++/C si construirea bibliotecii cu încărcare dinamica dll.
#include <jni.h>
#include "numeFisierPrototip.h"
JNIEXPORT tip JNICALL Java_numeClasa_metoda(JNIEnv *env, jobject obj,
listaParametrii)
{ ....
[return;]
}
4. Încărcarea bibliotecii dinamice în aplicația Java si rularea aplicației.
System.loadLibrary(numeDll)
Tipuri definite in JNI

• Tipuri definite la nivelul "win\jni_mh.h"


• typedef long jint;
• typedef __int64 jlong;
• typedef signed char jbyte;

• Tipuri definite la nivel "jni.h"


• typedef unsigned char jboolean;
• typedef unsigned short jchar;
• typedef short jshort;
• typedef float jfloat;
• typedef double jdouble;
• typedef jint jsize;
Tipuri de date JNI 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
tip[] j<tip>Array N/A
Identificatori de tipuri
Tip Java Signature
Se referă la identificatorii utilizați în
boolean Z
semnătura metodelor. byte B
Exemple: char C
Metoda Semnatura double D
void f1() ()V float F
int f2(int, long) (IJ)I int I
boolean f3(int[]) ([I)B long J

double f4(String, void V


(Ljava/lang/String;I)D object Lnume_calificat_clasa;
int)
void f5(int, String (I[Ljava/lang/String;C) tip[] [tip
[], char) V ( tip_argumente)
metoda
tip_returnat
Lucrul cu masive unidimensionale

• Sunt definite 9 tipuri de masive unidimensionale, 8 pentru tipurile primitive și unul pentru obiecte:
jintArray, jbyteArray, jshortArray, jlongArray, jfloatArray, jdoubleArray, jcharArray, jbooleanArray,
jobjectArray
• Funcții de lucru cu masive unidimensionale:
jsize GetArrayLength(JNIEnv *env, jarray array); // Dimensiune masiv
ArrayType New<PrimitiveType>Array(JNIEnv *env, jsize length); // Alocare masiv unidimensional
Exemplu: jintArray NewIntArray(JNIEnv *env, jsize len);
jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement); // Alocare
masiv obiecte
NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array, jboolean *isCopy); //
Preluare elemente. Exemplu pentru int:
jint *GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy)
jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index); // preluare un element cu
indexul precizat
void Set<Tip>ArrayRegion(JNIEnv *env, jtipArray a, jsize start, jsize len, const jtip *buf); //
Familie de funcții pentru copiere valori dintr-un buffer într-un masiv
Exemplu: SetIntArrayRegion(JNIEnv *env, jintArray a, jsize start, jsize len, const
jint *buf)

void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value); //


Stabilire valoare pentru obiectul de pe poziția index
void Get<PrimitiveType>ArrayRegion(JNIEnv *env, ArrayType array, jsize start, jsize len,
NativeType *buf); // Familie de funcții care copie o regiune dintr-un masiv într-un buffer
Accesarea câmpurilor clasei în funcțiile C++
• Accesarea câmpurilor si metodelor clasei se face prin mediul JNI.
• Accesarea câmpurilor presupune:
• Obținere referință la clasă:
jclass thisClass = env->GetObjectClass(obj);
• Obținerea identificatorului de câmp:
jfieldID fidField = env->GetFieldID(thisClass, "numeCamp", "IdentificatorDeTip");
• Obținerea valorii câmpului:
tip nume = env->GetTipField(obj, fidField);
Accesarea metodelor clasei în funcțiile C++
Accesarea metodelor presupune:
• Obținere referință la clasă:
jclass thisClass = env->GetObjectClass(obj);
• Obținerea identificatorului de metodă:
jmethodID myMethod = env->GetMethodID(thisClass, "numeMetoda", "IdentificatorDeTip");
• Invocarea metodei:
env->CallTipMethod(obj, myMethod);
Fișiere
Fișiere

• Conceptul de fișier este implementat prin două clase: File, RandomAccessFile

• Declarația de clasă File:


public class File extends Object implements Serializable, Comparable;

• Constructori:
File(String cale);
File(String dir, String fis);
File(File dir,String fis);
File(URI uri);
• Metode frecvent utilizate ale clasei File:

public String getPath(); // Intoarce numele simplu


public String getAbsolutePath();
public String getCanonicalPath() throws IOException;
public boolean exists();
public boolean isDirectory();
public boolean isFile();
public long length();
public String[] list(); //Lista fisierelor apartinatoare
boolean canRead();
boolean canWrite();
boolean delete();
public File[] listFiles();
boolean renameTo(File numeNou);

Exemplu: E_ListareRecursivaDirector
• Filtrarea fișierelor
Se utilizează interfețele FileFilter și FilenameFilter in metodele listFiles a clasei File:
public File[] listFiles(FileFilter filter);
public File[] listFiles(FilenameFilter filter);

Declarații de interfață:
public interface FileFilter;
public interface FilenameFilter;

Metoda abstractă FileFilter:


boolean accept(File pathname);
Metoda abstractă FilenameFilter:
boolean accept(File dir, String name);

(Exp: E_FiltrareaFisierelor)
Fișiere cu acces direct
• Sunt implementate prin clasa RandomAccessFile
• Declarația de clasă:
public class RandomAccessFile extends Object implements
DataOutput, DataInput, Closeable;
• Constructori
public RandomAccessFile(File file, String mode) throws FileNotFoundException;
public RandomAccessFile(String name, String mode)
throws FileNotFoundException;
mode: "r" - utilizat doar pentru citire, "rw" - citire si scriere, "rwd" - actualizări sincrone ale
conținutului, "rws" - actualizări sincrone ale conținutului si meta-datelor (dimensiune, data creării, data
modificării, permisiuni etc.)

• Metode de poziționare
long getFilePointer() throws IOException;
long length() throws IOException;
void seek(long poz) throws IOException;
public int skipBytes(int n) throws IOException;
• Citiri/scrieri de nivel scăzut
int read() throws IOException;
int read(byte dst[]) throws IOException;
int read(byte dst[], int index, int lung) throws IOException;
void write(int b) throws IOException;
void write(byte srs[]) throws IOException;
void write(byte srs[], int index, int lung) throws IOException;
• Închidere fișier
void close() throws IOException;

Exemplu: E_FisiereRelative

S-ar putea să vă placă și