This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
laboratoare:reflection [2015/01/05 01:48] cosmin.boaca created |
laboratoare:reflection [2015/01/07 00:28] (current) cosmin.boaca [Java Native Interface (JNI)] |
||
---|---|---|---|
Line 2: | Line 2: | ||
* Responsabil: Cosmin Boacă | * Responsabil: Cosmin Boacă | ||
- | * Data publicării: 04.01.2015 | + | * Data publicării: 05.01.2015 |
- | * Data ultimei modificări: 04.01.2015 | + | * Data ultimei modificări: 05.01.2015 |
==Obiective== | ==Obiective== | ||
- | Scopul acestui laborator este familiarizarea studenţilor cu noţiunnile de **Reflection** si de **Java Native Interface**. | + | Scopul acestui laborator este familiarizarea studenţilor cu noţiunnile de **Reflection**, **Java Native Interface** și **Annotations**. |
==Java Native Interface (JNI)== | ==Java Native Interface (JNI)== | ||
Line 19: | Line 19: | ||
<code java NativeMethodDeclaration.java> | <code java NativeMethodDeclaration.java> | ||
- | private int native_add(int num1, int num2); | + | package laborator; |
+ | |||
+ | class NativeTest { | ||
+ | private int nativeAdd(int num1, int num2); | ||
+ | } | ||
</code> | </code> | ||
- | Declararea și definirea funcției in C este ceva mai complicată și nu va fi prezentată. | + | Functia in C/C++ trebuie sa aiba urmatoarea definite |
+ | |||
+ | <code C> | ||
+ | extern "C" { | ||
+ | Java_laborator_NativeTest_nativeAdd(JNIEnv *env, JObject obj, Jint a, Jint b) { | ||
+ | return a + b; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Numele metodei in C derivă din numele fully qualified al metodei din Java. (nume_pachet.nume_clasa.nume_metoda). Pentru metoda de mai sus, acest nume este laborator.NativeTest.nativeAdd. | ||
+ | Numele metodei din C se formeaza prin concatenarea Java_ la numele metodei în care . este inlocuit cu _ . | ||
+ | Metoda va fi compilată într-o bibliotecă partajată (shared_library) cu linking de C (extern "C"), acest lucru fiind necesar pentru a putea fi găsită corect din Java. | ||
==Reflection== | ==Reflection== | ||
Line 37: | Line 54: | ||
<code java> | <code java> | ||
- | private native Field[] getDeclaredFields0(boolean publicOnly); | + | private native Field[] getDeclaredFields(); |
- | private native Method[] getDeclaredMethods0(boolean publicOnly); | + | private native Method[] getDeclaredMethods(); |
- | private native Constructor<T>[] getDeclaredConstructors0(boolean publicOnly); | + | private native Constructor<T>[] getDeclaredConstructors(); |
- | private native Class<?>[] getDeclaredClasses0(); | + | private native Class<?>[] getDeclaredClasses(); |
private native Annotation[] getDeclaredAnnotations(); | private native Annotation[] getDeclaredAnnotations(); | ||
</code> | </code> | ||
Line 65: | Line 82: | ||
} | } | ||
- | class TCPTransporter implements Transporter; | + | class TCPTransporter extends Transporter; |
- | class UDPTransporter implements Transporter; | + | class UDPTransporter extends Transporter; |
- | class HTTPSTransporter implements Transporter; | + | class HTTPSTransporter extends Transporter; |
class XMLSerializer implements ISerializer; | class XMLSerializer implements ISerializer; | ||
Line 84: | Line 101: | ||
<component name="transporter" type="HTTPSTransporter"> | <component name="transporter" type="HTTPSTransporter"> | ||
<component name="serializer" type="JSONSerializer" /> | <component name="serializer" type="JSONSerializer" /> | ||
- | <component name="public_key" source_file="id_rsa.pub" /> | ||
</component> | </component> | ||
<component name="storage" type="CloudStorage"> | <component name="storage" type="CloudStorage"> | ||
Line 194: | Line 210: | ||
- **(2p)** Creati clasa ''ReflectionDummy'', o clasă care va conține 3 membri de tipul int, unul private, unul protected și unul public. Creați un obiect din această clasă și setați valorile membrilor folosind API-ul pentru Reflection. Folosiți metoda ''getDeclaredFields'' din clasa ''Class'', și metodele ''setAccessible'' respectiv ''set'' din clasa ''Field''. | - **(2p)** Creati clasa ''ReflectionDummy'', o clasă care va conține 3 membri de tipul int, unul private, unul protected și unul public. Creați un obiect din această clasă și setați valorile membrilor folosind API-ul pentru Reflection. Folosiți metoda ''getDeclaredFields'' din clasa ''Class'', și metodele ''setAccessible'' respectiv ''set'' din clasa ''Field''. | ||
- | - **(10p)** Acest task va urmări crearea unei clase ce poate rula teste având o funcționalitate de bază asemănătoare cu aceea a framework-ului Junit. Se vor folosi metodele ''getMethods'' și ''getAnnotations''. | + | - **(10p)** Acest task va urmări crearea unei clase ce poate rula teste având o funcționalitate de bază asemănătoare cu aceea a framework-ului Junit. Se vor folosi metodela ''Modifier.isPublic'' a clasei ''Modifier'', cât și metodele ''getGenericReturnType'', ''getGenericParameterTypes'', ''getAnnotations'' ale clasei ''Method''. Puteți folosi orice alte metode considerați din API. |
* **(2p)** Definirea adnotărilor ''@Test'', ''@Before'', ''@After''. | * **(2p)** Definirea adnotărilor ''@Test'', ''@Before'', ''@After''. | ||
- | * **(2p)** Rularea metodelor cu adnotarea ''@Test'' și contorizarea testelor care au picat, care au trecut, sau care au avut erori de rulare. Un test are erori de rulare daca aruncă o excepție care nu este prinsă. Toate aceste metode trebuie să aibă tipul de retur ''boolean'' și să nu primească parametri. (Vor returna true dacă testul trece sau false daca pică). | + | * **(2p)** Identificarea metodelor cu adnotarea ''@Test''. Toate aceste metode trebuie să aibă tipul de retur ''boolean'' și să nu primească parametri. (Vor returna true dacă testul trece sau false daca pică). Programul trebuie să arunce excepție dacă există vreo metodă cu adnotarea ''@Test'' care nu respectă semnătura și trebuie să ia în considerare doar metodele publice. |
- | * **(2p)** Identificarea și rularea metodelor cu adnotarea ''@Before'' înainte de fiecare test. | + | * **(2p)** Identificarea metodelor cu adnotarea ''@Before'' înainte de fiecare test. Metodele trebuie să returneze void și șă nu primească parametri. Programul va verifica acest lucru și va lua în considerare doar metodele publice. |
- | * **(2p)** Identificarea și rularea metodelor cu adnotarea ''@After'' după fiecare test. | + | * **(2p)** Identificarea metodelor cu adnotarea ''@After'' după fiecare test. Aceleași mențiuni ca si metodele cu adnotarea ''@Before''. |
- | * **(2p)** Implementarea unei clase ''TestRunner'' care conține o metodă statică run care primeste ca parametru un String reprezentând numele unei clase ce conține teste. Această clasă va rula testele din clasa primită ca parametru și va afișa o statistică sub forma : | + | * **(2p)** Implementarea unei clase ''TestRunner'' care conține o metodă statică run care primeste ca parametru un String reprezentând numele unei clase ce conține teste. Această clasă va rula testele din clasa primită ca parametru precum și metodele de setup respectiv tear down și va afișa o statistică sub forma : |
numeMetoda1 failed/passed/error | numeMetoda1 failed/passed/error | ||
Line 208: | Line 224: | ||
failed : numărTesteEșuate | failed : numărTesteEșuate | ||
errors : numărTesteEronate | errors : numărTesteEronate | ||
+ | |||
+ |